Go 沒有像 Java 那樣的異常機制,例如你無法像在 Java 中那樣拋出一個異常。作為替代,它使用了恐慌和恢復(panic-and-recover)機制。一定要記得,這應當作為最后的手段被使用,你的代碼中應當沒有,或者很少的令人恐慌的東西。
- panic
是一個內建函數,可以中斷原有的控制流程,進入一個令人恐慌的流程中。當函數 F 調用 panic,函數 F 的執行被中斷,並且 F 中的延遲函數會正常執行,然后 F 返回到調用它的地方。在調用的地方, F 的行為就像調用了 panic。這一過程繼續向上,直到程序崩潰時的所有 goroutine 返回。恐慌可以直接調用 panic 產生。也可以由運行時錯誤產生,例如訪問越界的數組。
- recover
是一個內建的函數,可以讓進入令人恐慌的流程中的 goroutine 恢復過來。 recover僅在延遲函數中有效。在正常的執行過程中,調用 recover 會返回 nil 並且沒有其他任何效果。如果當前的 goroutine 陷入恐慌,調用 recover 可以捕獲到 panic 的輸入值,並且恢復正常的執行。recover只有在defer調⽤的函數中有效
package main import "fmt" func Demo(i int) { //定義10個元素的數組 var arr [10]int //錯誤攔截要在產⽣錯誤前設置 defer func() { //設置recover攔截錯誤信息 err := recover() //產⽣panic異常 打印錯誤信息 if err != nil { fmt.Println(err) } }() //根據函數參數為數組元素賦值 //如果i的值超過數組下標 會報錯誤:數組下標越界 arr[i] = 10 } func main() { Demo(10) //產⽣錯誤后 程序繼續 fmt.Println("程序繼續執⾏...") }
