Golang的異常處理
Golang的異常處理

“ 閱讀本文大概需要3.4分鐘 ”
Golang的優(yōu)點有很多,以前的文章中也有提到過,但也有很多槽點為Gopher所詬病,尤其是 錯誤處理。
在說錯誤和異常之前,先要說兩個概念:
錯誤處理:錯誤是業(yè)務(wù)中的一部分,是可以預(yù)見的。
異常處理:非業(yè)務(wù)的一部分,不可預(yù)見的。
錯誤處理
首先看一下示例代碼:
file, err := os.Open("/usr/local/test.txt")
Golang官方推薦上述代碼中的錯誤處理方式,并且建議 err放在返回值的最后。我們在日常的編碼中也需要遵循這樣的規(guī)則來定義 func。
在Gopher間流傳著這樣一個笑話:一半時間在編寫代碼,一半時間在寫錯誤處理。
示例代碼:
func Open(name string) (*File, error) {
? return OpenFile(name, O_RDONLY, 0)
}
但通常不是每個方法都需要處理 err,可以適當(dāng)?shù)膶?err返回給上層函數(shù),由上層函數(shù)統(tǒng)一打印或者處理錯誤。例如:http 路由中的錯誤可以在路由返回數(shù)據(jù)前處理,將錯誤信息和錯誤碼格式化后返回給 Client。
異常處理
Golang的異常處理比較特立獨行,需要 defer err recover()三者配合使用 ,而Java只要 try{}Catch()就可以搞定,還是來看一下示例代碼:
package main
import (
? ?"fmt"
)
func main() {
? ?test()
}
func test() ?{
? ?defer func() {
? ? ? ?if e := recover(); e != nil {
? ? ? ? ? ?fmt.Println("Worng!")
? ? ? ?}
? ?}()
? ?panic("panic")
}
如上代碼在 test()函數(shù)及其子函數(shù)中如果發(fā)生panic的錯誤,就會打?。?/p>
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ù)改寫如下:
package main
import (
? ?"fmt"
)
func main() {
? ?test()
}
func test() ?{
? ?defer tools.CoverErrorMessage()
? ?panic("panic")
}
func ?CoverErrorMessage() {
? if message := recover(); message != nil {
? ? ?var err error
? ? ?switch x := message.(type) {
? ? ?case string:
? ? ? ? err = errors.New(x)
? ? ?case error:
? ? ? ? err = x
? ? ?default:
? ? ? ? err = errors.New("Unknow panic")
? ? ?}
? ? ?Logger.Error("Recovered panic error : ",err)
? }
}
defer 處理異常時只能將
recover()寫在第一層函數(shù)中,否則將無法recover()到panic錯誤
-------------------?End?-------------------

歡迎大家點贊,轉(zhuǎn)發(fā),轉(zhuǎn)載,感謝大家的相伴與支持
想加入學(xué)習(xí)群請在后臺回復(fù)【入群】
萬水千山總是情,點個【在看】行不行
