<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Golang的異常處理

          共 1627字,需瀏覽 4分鐘

           ·

          2021-12-26 02:42

          Golang的異常處理


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


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

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

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

          異常處理:非業(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,可以適當?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的錯誤,就會打印:

          1. Worng!

          代碼封裝

          當然,在每個方法最上面寫這么一大堆冗余的代碼是很不優(yōu)雅的,也不符合面向對象的特性:封裝,于是便可以封裝成 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?-------------------

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

          想加入學習群請在后臺回復【入群

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

          瀏覽 61
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

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

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  中文字幕在线观看二区 | 伊伊成人网 | 椎名空一区二区三区无码观看 | 亚洲综合成人在线 | 日韩一区二区无码视频 |