处理 Go 例程中的恐慌
当 Go 例程中发生恐慌时,正确处理它是至关重要的。使用recover函数可以有效地检索panic值并进行相应的处理。
一种常见的方法是使用延迟函数在主函数中处理panic。然而,当panic发生在单独的goroutine中时,这种方法无法捕获它。
在给出的示例中:
func main() { done := make(chan int64) defer fmt.Println("Graceful End of program") defer func() { r := recover() if _, ok := r.(error); ok { fmt.Println("Recovered") } }() go handle(done) for { select { case <-done: return } } } func handle(done chan int64) { var a *int64 a = nil fmt.Println(*a) done <- *a }
panic发生在goroutine内的handle函数中,但是主函数中的延迟恢复函数无法捕获它。这是因为恢复仅在发生恐慌的同一 goroutine 中调用时才有效。
要解决此问题,请将延迟的恢复函数调用移到句柄函数中:
func main() { done := make(chan int64) defer fmt.Println("Graceful End of program") go handle(done) for { select { case <-done: return } } } func handle(done chan int64) { defer func() { r := recover() if _, ok := r.(error); ok { fmt.Println("Recovered") } }() var a *int64 a = nil fmt.Println(*a) done <- *a }
使用此修改后,当handle函数中出现panic时,同一个goroutine中的延迟恢复函数将捕获并相应地处理它。
以上是如何处理单独的 Go 例程中的恐慌?的详细内容。更多信息请关注PHP中文网其他相关文章!