Go 如何处理外面的恐慌

Go 如何处理外面的恐慌,go,Go,请看下面的代码片段 package main import "fmt" func explode() { // Cause a panic. panic("WRONG") } func recovery() int { explode() defer func() { fmt.Println("Try to handle panic") if err := recover(); err != nil {

请看下面的代码片段

package main

import "fmt"

func explode() {
    // Cause a panic.
    panic("WRONG")
}

func recovery() int {
    explode()
    defer func() {
        fmt.Println("Try to handle panic")
        if err := recover(); err != nil {
            fmt.Println("FIX")
            fmt.Println("ERR", err)
        }
    }()
    fmt.Println("Print value")
    return 100

}

func main() {
    // Handle errors in defer func with recover.
    fmt.Println(recovery())
}
正如上面的代码所示,我在explode函数中引发了恐慌,并希望在recovery函数中处理它。但是恐慌没有被抓住,我有运行时错误

goroutine 1 [running]:
main.explode()
        D:/gocode/src/samples/panic1.go:7 +0x6b
main.recovery(0xc082002250)
        D:/gocode/src/samples/panic1.go:18 +0x26
main.main()
        D:/gocode/src/samples/panic1.go:27 +0x26

goroutine 2 [runnable]:
runtime.forcegchelper()
        c:/go/src/runtime/proc.go:90
runtime.goexit()
        c:/go/src/runtime/asm_amd64.s:2232 +0x1

goroutine 3 [runnable]:
runtime.bgsweep()
        c:/go/src/runtime/mgc0.go:82
runtime.goexit()
        c:/go/src/runtime/asm_amd64.s:2232 +0x1

goroutine 4 [runnable]:
runtime.runfinq()
        c:/go/src/runtime/malloc.go:712
runtime.goexit()
        c:/go/src/runtime/asm_amd64.s:2232 +0x1
exit status 2
如何在recory函数中捕捉恐慌

如果您首先调用
explode()
,那么将处理
panic
并尝试恢复的函数尚未注册(而且永远不会注册,因为您在
explode()
内部调用了
panic
),因此它不会被调用,显然它无法完成其工作

您必须先调用
defer
,然后调用
explode()
函数:

defer func() {
    // recover() here, Your code omitted
}()
explode()

首先试一下。

非常感谢。如果出错,使用panic而不是
if err!=nil
语句?@zero\u编码
panic
recover
都有其用途,但只能在特殊情况下使用。如果可能,首选“正常”错误处理。有关更多详细信息,请阅读,以及博客文章和。