为了账号安全,请及时绑定邮箱和手机立即绑定

如何处理外面的恐慌

如何处理外面的恐慌

Go
catspeake 2021-09-13 16:18:08
看下面的代码片段。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上试一试。


查看完整回答
反对 回复 2021-09-13
  • 2 回答
  • 0 关注
  • 179 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信