我正在一個大型的Perl應用程序中工作,並希望每次調用'die'時都要獲取堆棧跟蹤。我知道Carp module,但我寧願不搜索/用'confess'來替換'die'的每個實例。另外,我希望在Perl模塊或Perl解釋器本身中有完整的堆棧跟蹤錯誤,顯然,我不能改變這些使用Carp。如何在Perl應用程序中將'die'替換爲'confess'?
那麼,有沒有辦法讓我在運行時修改'die'函數,使其表現得像'confess'?或者,是否有一個Perl解釋器設置會從「死亡」中拋出完整的堆棧跟蹤?
我正在一個大型的Perl應用程序中工作,並希望每次調用'die'時都要獲取堆棧跟蹤。我知道Carp module,但我寧願不搜索/用'confess'來替換'die'的每個實例。另外,我希望在Perl模塊或Perl解釋器本身中有完整的堆棧跟蹤錯誤,顯然,我不能改變這些使用Carp。如何在Perl應用程序中將'die'替換爲'confess'?
那麼,有沒有辦法讓我在運行時修改'die'函數,使其表現得像'confess'?或者,是否有一個Perl解釋器設置會從「死亡」中拋出完整的堆棧跟蹤?
使用Devel::SimpleTrace或Carp::Always他們會做你所要求的,沒有任何辛苦的工作。它們具有全局效果,這意味着它們可以輕鬆地在命令行上僅使用一次運行就可以添加。 -MDevel::SimpleTrace
。
我鏈接的模塊通過設置'$ SIG {__ DIE __}'來工作,所以是的,在一個捏中你可以自己做同樣的事情。該模塊只是有一些額外的代碼,使更好的輸出:) – hobbs 2009-12-09 23:29:46
這是自制錯誤處理的解決方案。你可以做任何你需要的事情,比如將錯誤保存在文件中或通過電子郵件發送。 – 2009-12-09 23:31:31
這是魔術閃耀的情況之一。 :) – 2009-12-10 18:01:58
的Error模塊將所有die
秒值進行轉換,以Error::Simple
對象,其中包含一個完整的堆棧跟蹤(構造解析「在文件... ..行」文本,並創建一個堆棧跟蹤)。您可以使用任意對象(通常從Error::Simple
中分類)來處理$Error::ObjectifyCallback
首選項的錯誤。
如果您通常會拋出其他類型的異常來發信號通知其他事件,那麼您會特別方便,因爲您只需爲Error::Simple
(或任何其他正在使用的錯誤類)添加處理程序,並使其轉儲堆棧跟蹤或執行根據錯誤類型進行專門的日誌記錄。
我通常只需要在一些代碼來代替die
S,所以我本地化__DIE__
處理程序:
{
use Carp;
local $SIG{__DIE__} = \&Carp::confess;
....
}
作爲開發工具,這可以工作,但一些模塊做手腳用它來獲取他們的功能工作。當您覆蓋他們期望的處理程序時,這些功能可能會以奇怪的方式打破。這不是一個好習慣,但有時會發生。
完美!謝謝! – 2009-12-09 23:25:14