use*_*610 7 error-handling stack-trace go panic
是否有可能"重新抛出"错误recover并保留原始堆栈跟踪?我知道如何做的最好的事情就是再次恐慌,但这确实会创建一个新的堆栈跟踪.
func do() {
defer func() {
cleanUp()
if x := recover(); x != nil {
handleError()
panic(x)
}
}()
doStuff()
}
Run Code Online (Sandbox Code Playgroud)
我想要这个的动机是,除非我的函数正常退出或handleError运行,否则我的程序会死锁.除非我保留原始的痕迹,否则我不知道它在哪里坠毁.
解决方案是不调用recover,因为既不能重新抛出也不能访问堆栈跟踪.使用bool标志而不是recover检查恐慌.
https://play.golang.org/p/PKeP9s-3tF
func do() {
panicked := true
defer func() {
cleanUp()
if panicked {
handleError()
}
}()
doStuff()
panicked = false
}
Run Code Online (Sandbox Code Playgroud)
即使不调用,堆栈中较高的延迟函数也会在恐慌时运行recover().
只需删除if语句和重新恐慌.然后处理你的错误,让恐慌继续上升.
func do() {
defer handleError()
doStuff()
}
Run Code Online (Sandbox Code Playgroud)
一个简单的演示:
https://play.golang.org/p/UiRou5MhUR
func a() {
defer func() {
fmt.Println("a")
}()
panic("test")
}
func b() {
defer func() {
fmt.Println("b")
}()
}
func main() {
fmt.Println("Hello, playground")
b()
}
Run Code Online (Sandbox Code Playgroud)
输出
Hello, playground
b
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1370 次 |
| 最近记录: |