我學習的Perl,並在很多我看到錯誤的例子是這樣Perl中錯誤處理的最佳實踐是什麼?
open FILE, "file.txt" or die $!;
的處理是在腳本中間die
真正處理錯誤的最好方法?
我學習的Perl,並在很多我看到錯誤的例子是這樣Perl中錯誤處理的最佳實踐是什麼?
open FILE, "file.txt" or die $!;
的處理是在腳本中間die
真正處理錯誤的最好方法?
更現代的方法是使用鯉魚標準庫。
use Carp;
my $fh;
open $fh, '<', "file.txt" or confess($!);
它的主要優點是它給死亡的堆棧跟蹤。
,除非你設置了一些其他的鯉魚東西,否則cro魚不會給出堆棧跟蹤。 – 2010-05-19 20:58:17
@brian:whoop,固定。 – 2010-05-19 20:59:24
謝謝!我不知道鯉魚......但是從什麼時候開始鯉魚呱呱叫? – SystematicFrank 2010-05-19 20:59:41
我使用模具,但我把它包裝的eval塊在錯誤處理控制:
my $status = eval
{
# Some code...
};
如果 'EVAL' 失敗:
$status
將是不確定的。[email protected]
將被設置的任何錯誤消息被產生的(或 一個die
的內容)如果「EVAL」成功:
$status
將是最後一個返回值塊。[email protected]
將被設置爲''。'eval {}'有很多問題需要隱晦的解決方法。改用Try :: Tiny。它將所有有害的樣板包裹在乾淨,易於使用的包裝中。 – daotoad 2010-05-19 21:54:24
eval {}'有很多問題需要隱晦的解決方法...如果您關心識別錯誤。如果你打算採取同樣的行動,不管其原因如何,一個簡單的塊'eval'工作正常。但是,是的:在所有其他情況下使用'Try :: Tiny'。 – 2010-05-20 09:40:36
下次我編寫一些Perl時,我會嘗試一下。我使用這種方式來僞造try-catch(通過在eval塊之後添加$ @的檢查。)感謝提示。 – 2010-05-20 14:23:31
由於我幾乎在任何地方都使用Log::Log4perl,所以我用$logger->logdie
代替die
。如果您想對您的例外有更多的控制權,請考慮Exception::Class。
最好用Try::Tiny(請參閱它的文檔爲什麼)瞭解您的例外情況。
除非你有一個更具體的想法,然後是的當意想不到的事情發生時,你想死。
死亡對未能打開一個文件,並給予文件名是不是系統告訴你它無法讀取或寫入到一個匿名未定義的更好。
如果你正在談論一個「腳本」,一般來說你正在談論一段非常簡單的代碼。不需要協調的層(通常不)。在一個Perl 模塊中,有一個隨之而來的想法是你不擁有執行環境,所以無論是主軟件還是關心它,並且它在eval中捕獲事物,或者它並不真正關心和死亡就沒有問題。然而,你應該嘗試一個更健壯的模塊作爲模塊,並傳回undefs或其他東西。
你可以在eval塊中捕獲任何死亡(或cro)聲)。你可以在那裏做更具體的處理。
但是如果你想檢查$!那麼寫的代碼,你會有一個更具體的決議。
看看使用strict
的近似通用標準。這是死於可疑語法的代碼,而不是讓你繼續。
所以我覺得總體思路是:是,DIE,除非你有事情應該如何處理一個更好的主意。如果你有足夠的先見之明,你可以原諒你不會死的一兩次,因爲你知道你不需要。
有關perl異常的討論,請參見[有關perl中異常的細節?](http://stackoverflow.com/questions/2165161/whats-broken-about-exceptions-in-perl),[您是否使用Perl程序中的異常類?爲什麼或爲什麼?](http://stackoverflow.com/questions/2439966/do-you-use-an-exception-class-in-your-perl-programs-why-or-why-not)和[在Perl中面向對象的異常處理 - 是否值得?](http://stackoverflow.com/questions/503189/object-oriented-exception-handling-in-perl-is-it-worth-it) – Ether 2010-05-19 22:14:47