【问题标题】:Do you use an exception class in your Perl programs? Why or why not?你在你的 Perl 程序中使用异常类吗?为什么或者为什么不?
【发布时间】:2011-01-27 06:03:54
【问题描述】:

我有很多关于人们如何在 Perl 中使用异常的问题。我已经包含了一些关于例外情况的背景说明,如果您愿意,请跳过此部分,但请花点时间阅读问题并做出回应。

谢谢。

Perl 异常背景

Perl 有一个非常基本的内置异常系统,它为更复杂的使用提供了一个跳板。

例如,die "I ate a bug.\n"; 会引发异常,并将字符串分配给 $@

你也可以抛出一个对象,而不是一个字符串:die BadBug->new('I ate a bug.');

您甚至可以安装一个信号处理程序来捕获 SIGDIE 伪信号。这是一个将异常作为对象重新抛出的处理程序。

$SIG{__DIE__} = sub { 
    my $e = shift; 
    $e = ExceptionObject->new( $e ) unless blessed $e;
    die $e;
}

此模式用于许多 CPAN 模块。但是 perlvar 说:

由于实施故障, $SIG{DIE} 钩子甚至被调用 在 eval() 中。不要用这个来 重写 $@ 中的未决异常,或 作为压倒一切的奇怪替代品 核心::全球::死()。这个奇怪的 远距离的动作可以固定在一个 未来版本,以便 $SIG{DIE} 仅当您的程序是 即将退出,和原来一样 意图。任何其他用途均已弃用。

所以现在我想知道在 sigdie 中客观化异常是否是邪恶的。

问题

  1. 您是否使用异常对象?如果是这样,是哪一个?为什么?如果没有,为什么不呢?

  2. 如果您不使用异常对象,什么会吸引您使用它们?

  3. 如果您确实使用异常对象,您讨厌它们的什么地方,还有什么更好的地方?

  4. 在 DIE 处理程序中客观化异常是个坏主意吗?

  5. 我应该在哪里客观化我的例外?在我的 eval{} 包装器中?在 sigdie 处理程序中?

  6. 是否有任何关于一般异常和 Perl 中的异常的论文、文章或其他资源对您有用或有启发性。

Perlmonks 交叉发布。

【问题讨论】:

标签: perl exception


【解决方案1】:

我不经常使用异常对象;主要是因为字符串通常就足够了并且涉及的工作更少。这是因为程序通常对异常无能为力。如果它可以避免异常,那么它一开始就不会导致它。

如果您可以对异常做点什么,请使用对象。如果您只是要终止程序(或某个子集,例如 Web 请求),请省去想出一个复杂的对象层次结构的工作,这些对象仅包含一条消息。

至于 4 号;永远不要使用$SIG{__DIE__}。它不组成;如果一个模块期望 sigdie 以一种方式工作,并且加载了另一个模块使其以其他方式工作,则这些模块不能再在同一个程序中使用。所以不要那样做。

如果您想使用对象,只需执行非常无聊的die Object->new( ... )。它可能不像某处的某种超级神奇的魔法那样令人兴奋,但它总是有效,并且代码完全按照它所说的那样工作。

【讨论】:

    猜你喜欢
    • 2011-11-10
    • 2016-09-07
    • 2010-09-11
    • 2010-09-30
    • 2015-05-14
    • 1970-01-01
    • 1970-01-01
    • 2010-11-25
    • 2010-09-12
    相关资源
    最近更新 更多