在Go例程中處理恐慌
Go提供了panic()和recover()內建函數來管理意外錯誤和致命情況運行程式碼。要處理 go 例程中的恐慌,必須了解recover()的範圍。
理解recover()範圍
recover()只能從恐慌中恢復在引起恐慌的同一個 goroutine 中。如果在沒有活動的recover()的情況下發生恐慌,整個程式將會崩潰。
錯誤處理不正確的範例
問題中提供的程式碼範例無法處理panic,因為recover()是在主例程中定義的,而panic是在handle() goroutine中引發的。因此,recover() 無法存取恐慌值。
func main() { // ... go handle(done) // ... } func handle(done chan int64) { // ... fmt.Println(*a) // Panic here done正確錯誤處理範例
要處理 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解釋
在這個更正的例子中,recover()現在位於handle() goroutine中,因此它可以捕獲透過取消引用nil指針而引發的恐慌。然後恐慌被恢復,並列印“Recovered”訊息。
瞭解recover()的範圍對於Go例程中有效的錯誤處理至關重要。始終將recover()放在可能發生恐慌的同一個goroutine中,以優雅地處理和報告任何意外情況。
免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。
Copyright© 2022 湘ICP备2022001581号-3