【问题标题】:Exception Handling in perlperl 中的异常处理
【发布时间】:2013-02-24 09:25:24
【问题描述】:

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

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

【问题讨论】:

    标签: perl perl-module


    【解决方案1】:

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

    eval 返回该 false 值。

    为什么需要这样做?

    这不是必需的。

    my $foo = eval { foo() };
    

    如果您对$foo 在异常情况下为 undef 感到满意,那就太好了。

    你看到的是

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

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

    【讨论】:

      【解决方案2】:

      扩展 ikegami 的回答:大多数人都这样编写代码:

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

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

      【讨论】:

      • 不正确。这是一个多年前修复的旧错误。从 v5.14 delta 版开始:“当在“eval”中引发异常时,异常不再有被展开期间运行的析构函数代码破坏的风险。”不止于此;请参阅发行说明。
      • @tchrist,好吧,仍然可以通过抛出一个字符串化为“”或“0”的对象,但我必须同意 if ($@) 再次可以接受,因为该错误已修复......假设也就是说,您可以将向后兼容性抛到脑后。
      • 我知道这个修复并更新了我的帖子。无论如何,绝大多数 Perl 用户没有使用更合理的 Perl 版本。 CentOS 5 还在 5.8 上!
      猜你喜欢
      • 1970-01-01
      • 2013-01-05
      • 2016-06-12
      • 1970-01-01
      • 2020-06-26
      • 1970-01-01
      • 2019-01-09
      • 2010-10-04
      • 1970-01-01
      相关资源
      最近更新 更多