2 回答
TA贡献1811条经验 获得超4个赞
解决方案是不调用recover,因为这样既不可能重新抛出也不访问堆栈跟踪。使用 bool 标志而不是recover检查恐慌。
https://play.golang.org/p/PKeP9s-3tF
func do() {
panicked := true
defer func() {
cleanUp()
if panicked {
handleError()
}
}()
doStuff()
panicked = false
}
TA贡献1827条经验 获得超7个赞
堆栈中更高层的延迟函数将在恐慌时运行,即使它们不调用recover().
只需删除 if 语句和重新恐慌。然后处理你的错误,让恐慌继续向上堆栈。
func do() {
defer handleError()
doStuff()
}
一个简单的演示:
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()
}
输出
Hello, playground
b
- 2 回答
- 0 关注
- 163 浏览
添加回答
举报