看下面的代码片段。package mainimport "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函数中触发了一个panic,并希望在recovery函数中处理它。但是恐慌没有被抓住,我有运行时错误goroutine 1 [running]:main.explode() D:/gocode/src/samples/panic1.go:7 +0x6bmain.recovery(0xc082002250) D:/gocode/src/samples/panic1.go:18 +0x26main.main() D:/gocode/src/samples/panic1.go:27 +0x26goroutine 2 [runnable]:runtime.forcegchelper() c:/go/src/runtime/proc.go:90runtime.goexit() c:/go/src/runtime/asm_amd64.s:2232 +0x1goroutine 3 [runnable]:runtime.bgsweep() c:/go/src/runtime/mgc0.go:82runtime.goexit() c:/go/src/runtime/asm_amd64.s:2232 +0x1goroutine 4 [runnable]:runtime.runfinq() c:/go/src/runtime/malloc.go:712runtime.goexit() c:/go/src/runtime/asm_amd64.s:2232 +0x1exit status 2如何捕捉recory函数中的panic?
2 回答
心有法竹
TA贡献1866条经验 获得超5个赞
如果您explode()先调用,则将处理panic并尝试恢复的函数尚未注册(并且永远不会注册,因为您调用了panicinside explode()),因此不会调用它,显然它无法完成其工作。
您必须先调用defer,然后调用explode()函数:
defer func() {
// recover() here, Your code omitted
}()
explode()
在Go Playground上试一试。
- 2 回答
- 0 关注
- 179 浏览
添加回答
举报
0/150
提交
取消