2009-12-09 27 views
17

我正在一個大型的Perl應用程序中工作,並希望每次調用'die'時都要獲取堆棧跟蹤。我知道Carp module,但我寧願不搜索/用'confess'來替換'die'的每個實例。另外,我希望在Perl模塊或Perl解釋器本身中有完整的堆棧跟蹤錯誤,顯然,我不能改變這些使用Carp。如何在Perl應用程序中將'die'替換爲'confess'?

那麼,有沒有辦法讓我在運行時修改'die'函數,使其表現得像'confess'?或者,是否有一個Perl解釋器設置會從「死亡」中拋出完整的堆棧跟蹤?

回答

32

使用Devel::SimpleTraceCarp::Always他們會做你所要求的,沒有任何辛苦的工作。它們具有全局效果,這意味着它們可以輕鬆地在命令行上僅使用一次運行就可以添加。 -MDevel::SimpleTrace

+1

完美!謝謝! – 2009-12-09 23:25:14

12

如何設置__DIE__信號處理程序?類似於

$SIG{__DIE__} = sub { Carp::confess @_ }; 

在腳本的頂部?有關更多信息,請參閱perlvar %SIG

+0

我鏈接的模塊通過設置'$ SIG {__ DIE __}'來工作,所以是的,在一個捏中你可以自己做同樣的事情。該模塊只是有一些額外的代碼,使更好的輸出:) – hobbs 2009-12-09 23:29:46

+0

這是自制錯誤處理的解決方案。你可以做任何你需要的事情,比如將錯誤保存在文件中或通過電子郵件發送。 – 2009-12-09 23:31:31

+0

這是魔術閃耀的情況之一。 :) – 2009-12-10 18:01:58

0

Error模塊將所有die秒值進行轉換,以Error::Simple對象,其中包含一個完整的堆棧跟蹤(構造解析「在文件... ..行」文本,並創建一個堆棧跟蹤)。您可以使用任意對象(通常從Error::Simple中分類)來處理$Error::ObjectifyCallback首選項的錯誤。

如果您通常會拋出其他類型的異常來發信號通知其他事件,那麼您會特別方便,因爲您只需爲Error::Simple(或任何其他正在使用的錯誤類)添加處理程序,並使其轉儲堆棧跟蹤或執行根據錯誤類型進行專門的日誌記錄。

+1

有時'錯誤'打破別人的異常處理代碼,並導致一個小調試噩夢:) – hobbs 2009-12-10 00:09:52

+0

是的,可悲的是它確實。我最近也不得不放棄它,因爲它喜歡用與Moose不兼容的'with'出口。我現在主要總結出例外是邪惡的。 :) – Ether 2009-12-10 01:29:58

2

我通常只需要在一些代碼來代替die S,所以我本地化__DIE__處理程序:

{ 
use Carp; 
local $SIG{__DIE__} = \&Carp::confess; 

.... 
} 

作爲開發工具,這可以工作,但一些模塊做手腳用它來獲取他們的功能工作。當您覆蓋他們期望的處理程序時,這些功能可能會以奇怪的方式打破。這不是一個好習慣,但有時會發生。

相關問題