Golang不是面嚮對象語言,也沒有try ... catch... 或者 try ... exception... 結構。
Golang語言使用panic、recover,配合着defer,來完成類似功能。
defer本身用處很多,比如延後執行(函數結束時候才執行)。看個例子:
package main
import "fmt"
func main() {
var i int
defer fmt.Println("end")
fmt.Println("begin: 0")
i++
fmt.Println(i)
}
//輸出結果:
begin: 0
1
end
panic和recover的需要注意幾點:
- defer 需要放在 panic 之前定義,另外recover只有在 defer 調用的函數中才有效
- recover處理異常後,邏輯並不會恢復到 panic 那個點去,函數跑到 defer 之後的那個點
- 多個 defer 會形成 defer 棧,後定義的 defer 語句會被最先調用
看個例子:
package main
import (
"fmt"
"time"
)
func main() {
f()
fmt.Println("end")
}
func f() {
defer func() {
fmt.Println("start defer part")
if err := recover(); err != nil {
fmt.Println("err: ",err)
}
fmt.Println("end defer part")
}()
for {
fmt.Println("func begins")
a := []int{1,2}
fmt.Println(a[3])
panic("bug occurs")
fmt.Println("func ends")
time.Sleep(1 * time.Second)
}
}
//執行結果:
func begins
start defer part
err: runtime error: index out of range
end defer part
end
程序執行結果,貌似往panic裏面扔什麼字符串都沒關係... 反正沒被引出來。
不管前面錯不錯,它就是強行觸發,執行退出(defer操作... )...
具體錯誤信息,從recover()裏面讀出來。如果沒出錯,則不讀出...
當前理解如此,後面如有新體會,則續寫本帖。