一起重溫golang中的異常處理啊?
注意事項
常規使用
panic
以及recover
引數型別為空介面(可儲存任何型別物件)inte***ce{}
/*
func panic(v inte***ce{})
func recover() inte***ce{}
執行順序:panic()->帶recover的defer
輸出結果:
oh my god!panic.
解釋:defer中的recover成功捕獲到了panic的異常
*/package main
import (
"fmt"
)func main()
}()panic("oh my god!panic.")
}
延遲呼叫中引發的錯誤,可被後續延遲呼叫捕獲(僅最後乙個錯誤**獲
)
/*
執行順序:panic()->帶panic的defer匿名函式->帶recover()的defer匿名函式
輸出結果:
catch the panic
解釋:defer中的recover僅能捕獲最後乙個錯誤
package main
import (
"fmt"
)func main()
}()defer func() ()
panic("something panic!")
}
捕獲函式recover()
只有在defer
呼叫內直接呼叫才會終止,否則返回nil
/*
**執行順序:panic->在匿名函式中巢狀recover的defer函式->帶fmt的defer->帶recover的defer->在匿名函式中呼叫recover的defer
輸出結果:
defer inner
defer recover panic error
解釋: 多個defer之間形成defer棧,最底部的defer優先執行;第三個defer列印了recover()的零值`nil`,僅有第乙個defer成功捕獲了最底部的panic("panic error")
*/package main
import "fmt"
func main() ()
defer recover()
defer fmt.println(recover())
defer func() ()
}()panic("panic error")
}
將**塊放置在匿名函式中可實現在函式邏輯中進行異常恢復,而不影響主函式
/*
**執行順序:匿名函式中的panic語句->匿名函式中i自加運算->匿名函式中的fmt->匿名函式中的defer->主函式中的fmt
輸出結果:
i is: 2
解釋:panic會終止其之後的執行,因此優先執行匿名函式中的panic之後便被defer中的recover捕獲,將i賦值為2,其後匿名函式退出開始繼續執行主函式中的fmt.println語句
*/package main
import "fmt"
func main()
func test()
}()panic("something panic!")
i = 8
fmt.println("no panic, i is:",i)
}()fmt.println("i is:",i)
}
goroutine中的recover
注意:
如果乙個沒有recover
的goroutine
發生了panic,那麼整個程序都會掛掉
/*
sync.waitgroup用來等待一組goroutine的結束,add方法用來設定等待的goroutine數量,done方法表示乙個goroutine執行結束,使用wait方法將全部的goroutine阻塞住,直到全部goroutine執行完畢
**執行順序:goroutine中的邏輯->wg.wait()->fmt.println
輸出結果:
panic recover assignment to entry in nil map
donw
解釋:在goroutine中我們宣告了乙個info的map[string]string型別,我們都知道在map,slice,channel都是引用型別,需要使用make函式進行初始化操作之後進行賦值。而這裡直接使用info["name"] = "bgbiao"進行賦值導致panic,fmt.println函式就會被終止執行,從而執行帶recover的defer,之後執行帶wg.done()的defer並退出goroutine執行主程式邏輯
*/package main
import (
"fmt"
"sync"
)func main()
}()var info map[string]string
info["name"] = "bgbiao"
fmt.println(info)
}()wg.wait()
fmt.println("done")
}
golang 異常處理
一般異常可以直接用 errors 包接收以及捕獲能遇見的異常,func test1 a,b int value int,err error else golang 允許多個返回值 error 常用語自定義異常丟擲返回異常包含一般異常 常用於不可預見不知情遇見的異常 panic可在程式中直接呼叫 pa...
golang中的異常處理機制
直接擼碼它不香麼 import errors fmt func main num1 2 num2 0 除零操作 res num1 num2 fmt.println res funcerro 2 自定義異常處理 在go中支援支援自定義異常處理 使用errors.new 和 panic 內建函式來處理 ...
golang 錯誤處理與異常
golang 中的錯誤處理的哲學和 c 語言一樣,函式通過返回錯誤型別 error 或者 bool 型別 不需要區分多種錯誤狀態時 表明函式的執行結果,呼叫檢查返回的錯誤型別值是否是 nil 來判斷呼叫結果。golang 中內建的錯誤型別 error 是乙個介面型別,自定義的錯誤型別也必須實現為 e...