another question 中的讨论让我想知道:其他编程语言的异常系统有什么 Perl 所缺乏的?
Perl 的内置异常有点特别,因为它们就像 Perl 5 对象系统一样,是事后才添加的,并且它们重载了其他非专用关键字( eval
和 die
)专门针对异常。
与具有内置 try/throw/catch 类型语法的语言相比,该语法可能有点难看。我通常这样做:
eval {
do_something_that_might_barf();
};
if ( my $err = $@ ) {
# handle $err here
}
有几个 CPAN 模块提供语法糖来添加 try/catch 关键字并允许轻松声明异常类层次结构等。
我看到的 Perl 异常系统的主要问题是使用了特殊的全局
$@
。保存当前错误,而不是专用的 catch
-type 机制,从范围的角度来看可能更安全,尽管我个人从未遇到过 $@
的任何问题越来越多。
最佳答案
大多数人已经学会处理异常的典型方法很容易丢失捕获的异常:
eval { some code here };
if( $@ ) { handle exception here };
你可以做:
eval { some code here; 1 } or do { handle exception here };
这可以防止由于
$@
而错过异常。被破坏,但它仍然容易丢失 $@
的值.为确保您不会破坏异常,当您进行评估时,您必须本地化
$@
;eval { local $@; some code here; 1 } or do { handle exception here };
这都是微妙的破坏,预防需要大量深奥的样板。
在大多数情况下,这不是问题。但是我被真实代码中的异常吞噬对象析构函数所烧毁。调试问题很糟糕。
情况显然很糟糕。看看 CPAN 上构建的所有模块都提供了不错的异常处理。
支持Try::Tiny的压倒性回应再加上 Try::Tiny 不是“太聪明一半”的事实,说服我尝试一下。像 TryCatch 这样的事情和 Exception::Class::TryCatch , Error , 等等都太复杂了,我无法相信。 Try::Tiny 是朝着正确方向迈出的一步,但我仍然没有可以使用的轻量级异常类。
关于perl - Perl 中的异常有什么问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2165161/