2010-10-23 113 views
22

我注意到Exception.pm和Error.pm似乎沒有廣泛用於Perl社區。這是由於異常處理的大尺寸eval在Perl中處理異常的最佳方式是什麼?

此外,Perl程序似乎對異常處理有更寬鬆的政策。這是否有一個令人信服的理由?

在任何情況下,Perl中用於異常處理的最佳方法是什麼?

+2

dupe of http://stackoverflow.com/questions/503189/is-object-oriented-exception-handling-in-perl-worth-it http://stackoverflow.com/questions/2165161/whats- broken-about-exceptions-in-perl http://stackoverflow.com/questions/2439966/do-you-use-an-exception-class-in-your-perl-programs-why-or-why-not http://stackoverflow.com/questions/1426501/how-do-i-handle-exceptions-in-a-procedural-language - 我們是否真的需要關於Perl異常處理的另一篇文章? – Ether 2010-10-23 22:19:02

+1

查看我的回答[Is Try :: Tiny仍然推薦用於Perl 5.14或更高版本中的異常處理?](http://stackoverflow.com/a/10374265/2766176) – 2014-12-20 07:19:39

回答

43

Perl社區的共識似乎是Try::Tiny是做異常處理的首選方式。您提到的「寬鬆政策」可能是由於以下因素的組合:

  • Perl不是完全面向對象的語言。 (例如,與其中的 無法避免處理異常的Java相反)。
  • 許多Perl開發人員的背景。 (語言如C 和shell沒有 異常機制。)
  • 人們傾向於使用Perl的任務類型。 (用於文本掃描的小腳本和不需要異常處理的 報告生成)
  • Perl沒有(良好的)內置的異常機制。

注意,最後一個項目意味着你會看到很多這樣的代碼:

eval { something() }; 
if ([email protected]) { 
    warn "Oh no! [[email protected]]\n"; 
} 

這是異常處理,即使它不使用try/catch語句的語法。儘管如此,它仍然很脆弱,並且會打破一些大多數人都沒有想到的微妙邊緣情況。 Try :: Tiny和CPAN上的其他異常處理模塊是爲了更容易正確使用而編寫的。

1. C確實有setjmp()longjmp(),它可以用於非常粗糙的異常處理形式。

+2

+1「讓它更容易*獲得正確「 – 2010-10-23 22:31:21

+15

只是爲了澄清原始海報可能會或可能不會遭受的一種常見誤解:'eval BLOCK' *不是*'eval STRING',並且不會在運行時編譯代碼。這只是一個異常處理方法 - 嘗試一個有趣的名字和有趣的語義。 – hobbs 2010-10-24 03:12:19

相關問題