请查看以下代码段。
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功能中的恐慌?
答案 0 :(得分:6)
如果您先调用explode()
,那么处理panic
并尝试恢复的功能尚未注册(永远不会因为您在{{1}内调用panic
}),所以它不会被调用,显然它无法完成它的工作。
您必须先调用explode()
,然后调用defer
函数:
explode()
在Go Playground上尝试。
答案 1 :(得分:0)
更多的是,“恐慌”只能在同一个套路内“恢复”,在外面是无法恢复的。