perl - Perl 中的异常有什么问题?

标签 perl exception syntax exception-handling

another question 中的讨论让我想知道:其他编程语言的异常系统有什么 Perl 所缺乏的?

Perl 的内置异常有点特别,因为它们就像 Perl 5 对象系统一样,是事后才添加的,并且它们重载了其他非专用关键字( evaldie )专门针对异常。

与具有内置 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/

相关文章:

.net - 使用对象初始值设定项语法的操作顺序

perl - 如何将套接字复制到其他变量

Perl Tie::IxHash - 有 'each' 方法吗?

ASP.NET 在哪里显示抛出新异常错误

C# 最终执行时间

python - 如何在Python中缩进堆栈跟踪?

ruby - 正则表达式在哪个位置失败?

sql - PostgreSQL:选择两个字段之一,具体取决于哪个字段为空

perl - 如何在出现 "Wide character in print at X line Y"消息时立即退出 Perl 程序?

perl - 如何在 vscode 的 PerlDebug 中查看 hashmap 变量?