2 回答

TA貢獻(xiàn)1828條經(jīng)驗(yàn) 獲得超4個(gè)贊
除非我誤解了您的問題,否則延遲函數(shù)調(diào)用將在恐慌時(shí)運(yùn)行,即使傳遞的值為nil
. 以下程序說明了這一點(diǎn):
package mainimport "fmt"func main() { defer func() { fmt.Println("Recover:", recover()) }() panic(nil)}
因此,您可以panic(nil)
通過比較recover()
to返回的值來輕松檢測是否發(fā)生了nil
。
編輯以回答評(píng)論:
是的,這是真的; 延遲調(diào)用通常會(huì)在函數(shù)返回時(shí)運(yùn)行。但是它們也會(huì)在 .a 之后展開調(diào)用堆棧時(shí)運(yùn)行panic()
。
問題更新后編輯:
您是正確的,沒有辦法區(qū)分這些情況。另一方面,恐慌nil
也沒有多大意義——尤其是因?yàn)檫@個(gè)限制。
panic(nil)
我能想到的唯一用例是故意避免恢復(fù)并強(qiáng)制程序因堆棧跟蹤而崩潰。不過,還有更優(yōu)雅的方法可以做到這一點(diǎn),runtime
例如使用包。

TA貢獻(xiàn)1796條經(jīng)驗(yàn) 獲得超10個(gè)贊
我可以在退出前設(shè)置一個(gè)標(biāo)志。
AFAIK,panic 是特定于 goroutine 的,并且單個(gè) goroutine 保證在單線程中。因此,不需要在 variable 周圍進(jìn)行同步/鎖定ok。如果我錯(cuò)了,請(qǐng)糾正我。
func clean(ok *bool) {
if *ok {
log.Printf("Execution OK. No panic detected.\n")
} else {
var reason = recover()
log.Printf("Some bad thing happen. reason = %v\n", reason)
panic("Abnormal exit. Program abandoned. Stack-trace here.")
debug.PrintStack() // Oops. this will not run.
}
}
func main() {
var ok bool = false
defer clean(&ok)
panic(nil)
test1() // Here's the main job.
ok = true
log.Printf("All work done. Quit gracefully.\n")
}
- 2 回答
- 0 關(guān)注
- 344 瀏覽
添加回答
舉報(bào)