在Go語言中,panic
和recover
是兩個內建的函數,用于處理異常情況。panic
用于引發一個運行時恐慌,它會中斷當前函數的執行,并開始逐層向上執行函數的延遲(defer)語句。如果沒有遇到可以處理這個恐慌的recover
,程序將會終止。recover
用于捕獲并處理panic
,它可以阻止恐慌的傳播,并允許程序繼續執行。
下面是一個簡單的示例,展示了如何使用panic
和recover
來處理錯誤:
package main
import "fmt"
func main() {
defer func() {
if r := recover(); r != nil {
fmt.Println("Recovered:", r)
}
}()
foo()
fmt.Println("This line will not be executed if foo() panics")
}
func foo() {
bar()
}
func bar() {
// 引發一個恐慌
panic("something went wrong")
}
在這個示例中,我們定義了一個匿名函數作為延遲函數,并在main
函數的末尾調用它。在延遲函數中,我們使用recover
來捕獲并處理panic
。如果foo()
函數引發了恐慌,bar()
函數將不會執行,main()
函數中的fmt.Println("This line will not be executed if foo() panics")
也不會執行。延遲函數將捕獲到恐慌,并打印出"Recovered: something went wrong"。
需要注意的是,recover
只能在延遲函數中捕獲到panic
。如果在引發恐慌的同一層級調用recover
,它將返回nil
,并且恐慌將繼續向上傳播,直到被捕獲或導致程序終止。因此,在使用panic
和recover
時,請確保將它們放在適當的延遲函數中。