在Go 例程中處理緊急情況
Go 提供了panic() 和recover() 內建函數來管理意外錯誤和致命情況運行代碼。要處理 go 例程中的恐慌,必須了解recover()的範圍。
了解recover()範圍
recover()只能從恐慌中恢復在引起恐慌的同一個 goroutine 中。如果在沒有主動recover()的goroutine中發生恐慌,整個程式將會崩潰。
錯誤處理不正確的範例
問題中提供的程式碼範例無法處理panic,因為recover()是在主程式中定義的,而panic是在handle() goroutine中引發的。因此,recover() 無法存取恐慌值。
func main() { // ... go handle(done) // ... } func handle(done chan int64) { // ... fmt.Println(*a) // Panic here done <- *a // Dereferencing nil pointer }
正確錯誤處理的例子
要處理 goroutine 中引發的恐慌,請放置recover () 在 goroutine 本身內。
func main() { // ... defer func() { if r := recover(); r != nil { fmt.Println("Recovered") } }() go handle(done) // ... } func handle(done chan int64) { // ... defer func() { if r := recover(); r != nil { fmt.Println("Recovered") } }() fmt.Println(*a) // Panic here done <- *a // Dereferencing nil pointer }
說明
在這個更正的範例中,recover() 現在位於handle() goroutine 中,因此它可以捕捉取消引用nil 指標引發的恐慌。然後恐慌被恢復,並列印“Recovered”訊息。
理解recover()的範圍對於Go例程中有效的錯誤處理至關重要。始終將recover()放在可能發生恐慌的同一個goroutine中,以優雅地處理和報告任何意外情況。
以上是如何處理 Go 例程中的恐慌:了解恢復範圍?的詳細內容。更多資訊請關注PHP中文網其他相關文章!