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
都有其用途,但只能在特殊情况下使用。如果可能,首选“正常”错误处理。有关更多详细信息,请阅读,以及博客文章和。