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條經驗 獲得超8個贊
堆棧中更高層的延遲函數將在恐慌時運行,即使它們不調用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 關注
- 195 瀏覽
添加回答
舉報