Go 例程提供了强大的并发机制,可以并行执行独立任务。然而,处理 Go 例程中的恐慌可能会带来挑战。
了解 Go 例程中的恢复
recover 函数允许从函数范围内发生的恐慌中恢复。然而,它的有效性仅限于发生恐慌的同一个 goroutine。尝试从其他 goroutine 中的恐慌中恢复将会失败。
代码示例:失败的恐慌恢复
下面的代码片段演示了从恐慌中恢复失败的代码片段goroutine:
func main() { // Note: the following code will panic go handle(make(chan int64)) for {} } func handle(done chan int64) { var a *int64 a = nil fmt.Println(*a) done <- *a }
这段代码无法从handle goroutine中的panic中恢复,因为recover必须在引发panic的同一个goroutine中调用。
代码示例:成功的恐慌恢复
要成功从 goroutine 中的恐慌中恢复,必须在麻烦的 goroutine 中添加 defer receive 语句。下面是早期代码的修改版本,可以按预期工作:
func main() { done := make(chan int64) go func() { defer func() { if r := recover(); r != nil { fmt.Println("Recovered") } }() var a *int64 a = nil fmt.Println(*a) done <- *a }() for {} }
在此示例中,延迟的恢复语句允许 goroutine 优雅地处理恐慌并记录恢复消息。
底层机制
根据 Go 文档,仅当当前 goroutine 中的所有延迟函数都已执行时才会发生紧急终止。因此,要从 Go 例程中的恐慌中恢复,必须在引发恐慌的同一个 Goroutine 中调用恢复,通常是通过延迟函数。
以上是如何从 Go 例程中的恐慌中恢复?的详细内容。更多信息请关注PHP中文网其他相关文章!