亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

我可以從恐慌中恢復,處理錯誤,然后再次恐慌并保留原始堆棧跟蹤嗎?

我可以從恐慌中恢復,處理錯誤,然后再次恐慌并保留原始堆棧跟蹤嗎?

Go
慕絲7291255 2021-12-07 10:52:48
是否可以“重新拋出”錯誤recover并保留原始堆棧跟蹤?我知道怎么做的最好的方法是再次恐慌,但這確實會創建一個新的堆棧跟蹤。func do() {    defer func() {        cleanUp()        if x := recover(); x != nil {            handleError()            panic(x)        }    }()    doStuff()}我想要這個的動機是,除非我的函數正常退出或handleError運行,否則我的程序會死鎖。除非我保留原來的 strack 痕跡,否則我不知道它在哪里墜毀。
查看完整描述

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

}


查看完整回答
反對 回復 2021-12-07
?
慕仙森

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


查看完整回答
反對 回復 2021-12-07
  • 2 回答
  • 0 關注
  • 195 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號