【发布时间】:2013-02-24 09:25:24
【问题描述】:
我看到 1 出现在 eval 块的末尾,用于 perl 中的异常处理。为什么需要这样做?如果 eval 块返回 false 会发生什么?
即使我们不直接使用 $@ 而是使用 CPAN 中的一些库来进行异常处理,这是否也需要?
【问题讨论】:
标签: perl perl-module
我看到 1 出现在 eval 块的末尾,用于 perl 中的异常处理。为什么需要这样做?如果 eval 块返回 false 会发生什么?
即使我们不直接使用 $@ 而是使用 CPAN 中的一些库来进行异常处理,这是否也需要?
【问题讨论】:
标签: perl perl-module
eval 返回该 false 值。
这不是必需的。
my $foo = eval { foo() };
如果您对$foo 在异常情况下为 undef 感到满意,那就太好了。
你看到的是
if (!eval { foo(); 1 }) {
...
}
代码返回 true 以让 if 知道 eval 成功。 eval 将在异常时返回 false。
【讨论】:
扩展 ikegami 的回答:大多数人都这样编写代码:
eval { might_throw_exception() };
if ($@) { ... }
这在 5.14 之前是错误的,因为 $@ 可能不是真实值,即使由于析构函数覆盖它或其他因素而引发异常也是如此。 return 1 是一种解决方法;完整说明请参见Try::Tiny。
【讨论】:
if ($@) 再次可以接受,因为该错误已修复......假设也就是说,您可以将向后兼容性抛到脑后。