4

我看到 1 出现在 eval 块的末尾,用于 perl 中的异常处理。为什么需要这样做?如果 eval 块返回 false 会发生什么?

即使我们不直接使用 $@ 而是使用 CPAN 中的一些库来进行异常处理,这是否也需要?

4

2 回答 2

6

如果 eval 块返回 false 会发生什么?

该错误值由eval.

为什么需要这样做?

这不是必需的。

my $foo = eval { foo() };

如果您可以$foo接受 undef 在异常情况下,那就太好了。

你看到的是

if (!eval { foo(); 1 }) {
   ...
}

代码返回 true 以if告知eval成功。eval将在异常时返回 false。

于 2013-02-24T09:35:46.253 回答
0

为了扩展 ikegami 的答案:大多数人编写这样的代码:

eval { might_throw_exception() };
if ($@) { ... }

这在 5.14 之前是错误的,因为$@即使由于析构函数覆盖它或其他因素而引发异常,它也可能不是真值。return 1是一种解决方法;有关完整说明,请参阅Try::Tiny

于 2013-02-24T10:46:04.077 回答