2010-10-23 128 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

相关问题