在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