異常處理
Go 語言引入了一個關于錯誤處理的標準模式,即 error 接口,它是 Go 語言內建的接口類型,該接口的定義如下:
package errorsfunc New(text string) error {return &errorString{text}
}// errorString is a trivial implementation of error.
type errorString struct {s string
}func (e *errorString) Error() string {return e.s
}
- 通過fmt包進行使用errorf接口
- 通過自帶的errors包進行調用
常用在我們對檢測程序是否正常
panic
在通常情況下,向程序使用方報告錯誤狀態的方式可以是返回一個額外的 error 類型值。
但是,當遇到不可恢復的錯誤狀態的時候,如數組訪問越界、空指針引用等,這些運行時錯誤會引起 painc 異常。在一般情況下,我們不使用 panic 函數來報告普通的錯誤,而應該只把它作為報告致命錯誤的一種方式。當某些不應該發生的場景發生時,就調用panic。
一般而言,當 panic異常發生時,程序會中斷運行,并立即執行在該 goroutine(可以先理解成線程,在中被延遲的函數(defer機制)。隨后,程序崩潰并輸出日志信息。日志信息包括 panic value 和函數調用的堆棧跟蹤信息。
不是所有的 panic 異常都來自運行時,直接調用內置的 panic 函數也會引發 panic 異常: panic函數接受任何值作為參數。
func panic(v interface{})
直接調用panic函數
直接調用內置的 panic 函數也會引發 panic 異常。
數組越界導致panic
recover
運行時 panc 異常一旦被引發就會導致程序崩潰。Go語言為我們提供了專用于“攔截”運行時 panic 的內建所數–recover。它可以是當前的程序從運行時 panic 的狀態中恢復并重新獲得流程控制權。
fune recover()interface{}
注意:recover只有在defer調用的所數中有效。
如果調用了內置函數recover,并且定義該 defer 語句的函數發生了 panic 異常,recover 會使程序從 panic 中恢復,并返回 panic value。導致panic 異常的函數不會繼續運行,但能正常返回。在未發生 panic 時調用recover,recover 會返回 nil。