2009-04-10 31 views
23

在Perl中,有沒有辦法強制所有致命錯誤顯示堆棧回溯如Carp::confess產生?如何在Perl中強制堆棧回溯所有致命錯誤?

我知道你可以做use warnings FATAL => 'all';來使警告在當前詞彙範圍內致命。

此外,有可能使用$SIG{__WARN__} = sub { CORE::die(@_) };來使所有警告致命的處處(尚未本地化SIGWARN處理程序)。

有沒有一種乾淨的方式來做到這一點,還是我需要調整SIGDIE?如果我確實寫了一個SIGDIE處理程序,那麼獲取跟蹤的最佳方法是什麼?

一個理想的解決方案將與標準測試庫Test::More和朋友一起工作。

更新:馬克約翰遜建議使用SIGDIE處理函數來調用Carp::confess。它很好地工作。代碼如下:

use Carp; 
$SIG{ __DIE__ } = sub { Carp::confess(@_) }; 
+0

同樣的問題,更多的答案:[我怎樣才能在Perl應用程序中替換所有的'死'與'承認?](http://stackoverflow.com/q/1877638/269126) – Lumi 2012-04-12 07:08:46

回答

16

安裝調用Carp :: confess的SIGDIE處理程序?或者只是設置鯉魚::承認作爲DIE的處理程序?

謹防與eval相關的standard gotchas。關於BEGIN塊有一個甚至weirder gotcha。還請注意ominous warning in perlvar

有關生成堆棧跟蹤的更多信息,請參閱this question

+0

我不知道爲什麼我沒有想到它。有用。 – daotoad 2009-04-10 20:12:27

11

另請參閱模塊「Carp::Always」,該模塊會將您的代碼中的所有模具和警告轉換爲堆棧跟蹤。