如何处理外面的恐慌

时间:2015-02-11 09:59:59

标签: 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 {
            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())
}

正如您可以看到上面的代码,我在爆炸功能中发出了恐慌,并希望在恢复功能中处理它。但是恐慌并没有被抓住,我有运行时错误

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功能中的恐慌?

2 个答案:

答案 0 :(得分:6)

如果您先调用explode(),那么处理panic并尝试恢复的功能尚未注册(永远不会因为您在{{1}内调用panic }),所以它不会被调用,显然它无法完成它的工作。

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

explode()

Go Playground上尝试。

答案 1 :(得分:0)

更多的是,“恐慌”只能在同一个套路内“恢复”,在外面是无法恢复的。

https://play.golang.org/p/e7-3SU2Cvss