go中的異常處理有三個關鍵字
defer panic recover
defer是用來解決異常發生之後有關資源的釋放問題,拋出異常之後仍然會執行defer所作用的函數,可以用原來釋放資源。
panic是用來拋出異常然後如果沒有捕獲異常的處理,就會導致程序終止。
應該養成比較好的習慣,就是每一個資源打開之後就使用defer關閉資源
import(
”fmt“
)
func main {
defer func() {
fmt.Println("After defer")
}()
file.Open(filepath)
defer file.Close() //習慣比較好
panic("terminate this programma")
fmt.Println("bye bye")
}
如果F的defer中無recover捕獲,則將panic拋到G中,G函數會立刻終止,不會執行G函數內後面的內容,但不會立刻return,而調用G的defer...以此類推。F中出現panic時,F函數會立刻終止,不會執行F函數內panic後面的內容,但不會立刻return,而是調用F的defer,如果F的defer中有recover捕獲,則F在執行完defer後正常返回,調用函數F的函數G繼續正常執行。先設置
func G() {
defer func() {
fmt.Println("c")
}()
F()
fmt.Println("繼續執行")
}
func F() {
defer func() {
if err := recover(); err != nil {
fmt.Println("捕獲異常:", err)
}
fmt.Println("b")
}()
panic("a")
}
結果
捕獲異常: a
b
繼續執行
c
記住一定要在panic之後寫上recover纔可以捕捉相關的異常,所以其實可以再defer裏面包含關於recover相關的內容