goang 錯誤&異常處理機制

renke發表於2021-09-09

基本概念

  • 錯誤:意料之內,可能出的問題, 比如網路連線超時,json解析錯誤等

  • 異常:意料之外,不應該出的問題,比如空指標異常,下標溢位等異常

錯誤處理

golang 使用error介面作為標準錯誤介面,

通常情況下錯誤處理方式

if err != nil{    //錯誤處理邏輯}

error作為函式返回值時應該放在最後一個返回值:eg:

func get()(res string, err error){    return}

使用error作為返回值的規範是函式體內有可能產生多種錯誤時返回error,當僅有一種error的可能或者型別時應該用bool型別代替,這樣更簡潔,eg:

//此方法種只有一種邏輯上的錯誤,不應該返回error, 推薦使用checkNumAreaB函式的寫法func checkNumArea(num int) error {    if num > 100{        return errors.New("超出值域")
    }    return nil
}

func checkNumAreaB(num int) bool {    if num > 100{        return false
    }    return true}

異常處理

The panic built-in function stops normal execution of the current goroutine. When a function F calls panic, normal execution of F stops immediately. Any functions whose execution was deferred by F are run in the usual way, and then F returns to its caller. To the caller G, the invocation of F then behaves like a call to panic, terminating G's execution and running any deferred functions. This continues until all functions in the executing goroutine have stopped, in reverse order. At that point, the program is terminated and the error condition is reported, including the value of the argument to panic. This termination sequence is called panicking and can be controlled by the built-in function recover.

從官方介紹可知panic呼叫會使整個呼叫棧逆序終止,最終導致整個程式終止並輸出調中棧資訊, 可使用recover方法捕獲異常而避免程式終結,生產環境種必須有此操作以避免程式終止

panic類似java的throw python的raise, recover 類似try catch

常用處理方式如下

func A(){    defer func(){
       fmt.Println("3") 
    }()    defer func(){        if err := recover(); err != nil{
            fmt.Println("err:", err)
        }
    }()
    
    panic("1")
    fmt.Println("2")
}
A()//outout://err:1//3
  • defer的執行邏輯時LIFO,

  • defer的執行是在函式執行完畢,return,panic之後的

  • panic之後的邏輯不再執行



作者:火頭陀
連結:


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/430/viewspace-2819968/,如需轉載,請註明出處,否則將追究法律責任。

相關文章