在 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 中,因此它可以捕获因取消引用而引发的恐慌零指针。然后恐慌被恢复,并打印“Recovered”消息。
理解recover()的范围对于Go例程中有效的错误处理至关重要。始终将recover()放在可能发生恐慌的同一个goroutine中,以优雅地处理和报告任何意外情况。
以上是如何处理 Go 例程中的恐慌:了解恢复范围?的详细内容。更多信息请关注PHP中文网其他相关文章!