1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        Golang的異常處理

        共 1627字,需瀏覽 4分鐘

         ·

        2021-12-26 02:42

        Golang的異常處理


        “ 閱讀本文大概需要3.4分鐘 ”


        Golang的優(yōu)點有很多,以前的文章中也有提到過,但也有很多槽點為Gopher所詬病,尤其是 錯誤處理。

        在說錯誤和異常之前,先要說兩個概念:

        錯誤處理:錯誤是業(yè)務(wù)中的一部分,是可以預(yù)見的。

        異常處理:非業(yè)務(wù)的一部分,不可預(yù)見的。

        錯誤處理

        首先看一下示例代碼:

        1. file, err := os.Open("/usr/local/test.txt")

        Golang官方推薦上述代碼中的錯誤處理方式,并且建議 err放在返回值的最后。我們在日常的編碼中也需要遵循這樣的規(guī)則來定義 func。

        在Gopher間流傳著這樣一個笑話:一半時間在編寫代碼,一半時間在寫錯誤處理。

        示例代碼:

        1. func Open(name string) (*File, error) {

        2. ? return OpenFile(name, O_RDONLY, 0)

        3. }

        但通常不是每個方法都需要處理 err,可以適當(dāng)?shù)膶?err返回給上層函數(shù),由上層函數(shù)統(tǒng)一打印或者處理錯誤。例如:http 路由中的錯誤可以在路由返回數(shù)據(jù)前處理,將錯誤信息和錯誤碼格式化后返回給 Client

        異常處理

        Golang的異常處理比較特立獨行,需要 defer err recover()三者配合使用 ,而Java只要 try{}Catch()就可以搞定,還是來看一下示例代碼:

        1. package main

        2. import (

        3. ? ?"fmt"

        4. )

        5. func main() {

        6. ? ?test()

        7. }

        8. func test() ?{

        9. ? ?defer func() {

        10. ? ? ? ?if e := recover(); e != nil {

        11. ? ? ? ? ? ?fmt.Println("Worng!")

        12. ? ? ? ?}

        13. ? ?}()

        14. ? ?panic("panic")

        15. }

        如上代碼在 test()函數(shù)及其子函數(shù)中如果發(fā)生panic的錯誤,就會打?。?/p>

        1. Worng!

        代碼封裝

        當(dāng)然,在每個方法最上面寫這么一大堆冗余的代碼是很不優(yōu)雅的,也不符合面向?qū)ο蟮奶匦裕?code style="box-sizing: border-box;background: rgb(243, 241, 241);color: rgb(88, 88, 88);line-height: 18px;">封裝,于是便可以封裝成 CoverErrorMessage() ,而 test()函數(shù)改寫如下:

        1. package main

        2. import (

        3. ? ?"fmt"

        4. )

        5. func main() {

        6. ? ?test()

        7. }

        8. func test() ?{

        9. ? ?defer tools.CoverErrorMessage()

        10. ? ?panic("panic")

        11. }

        12. func ?CoverErrorMessage() {

        13. ? if message := recover(); message != nil {

        14. ? ? ?var err error

        15. ? ? ?switch x := message.(type) {

        16. ? ? ?case string:

        17. ? ? ? ? err = errors.New(x)

        18. ? ? ?case error:

        19. ? ? ? ? err = x

        20. ? ? ?default:

        21. ? ? ? ? err = errors.New("Unknow panic")

        22. ? ? ?}

        23. ? ? ?Logger.Error("Recovered panic error : ",err)

        24. ? }

        25. }

        defer 處理異常時只能將 recover()寫在第一層函數(shù)中,否則將無法 recover()到panic錯誤

        -------------------?End?-------------------

        歡迎大家點贊,轉(zhuǎn)發(fā),轉(zhuǎn)載,感謝大家的相伴與支持

        想加入學(xué)習(xí)群請在后臺回復(fù)【入群

        萬水千山總是情,點個【在看】行不行

        瀏覽 61
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        評論
        圖片
        表情
        推薦
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            做爱视频免费观看网站 | 在线观看亚洲视频 | 蜜臀久久99精品久久宅男 | 久久无码电影 | 青青偷拍视频 | 国产探花一区二区 | 欧美日韩色情 | 欧美日韩国产在线播放 | 欧美熟女性爱视频 | a级黄色大片大片大片大片 |