你在Perl程序中使用异常类吗?为什么或者为什么不?

时间:2010-03-13 20:47:15

标签: perl exception

我有很多关于人们如何在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()中。不要用这个   重写$ @中的挂起异常,或   作为压倒一切的奇异替代品   CORE :: GLOBAL :: die()。这奇怪   远处的动作可以固定在一个   未来发布,以便$ SIG { DIE }   只有你的程序是   即将退出,就像原来一样   意图。任何其他用途都已弃用。

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

问题

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

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

  3. 如果你确实使用了异常对象,你有什么讨厌它们,哪些可能更好?

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

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

  6. 是否有任何关于一般和Perl的例外情况的文章,文章或其他资源,您觉得它们很有用或很有启发性。

  7. Perlmonks交叉发布。

1 个答案:

答案 0 :(得分:7)

我不经常使用异常对象;主要是因为字符串通常就足够了,所以工作量较少。这是因为程序通常无法对异常做任何事情。如果它可以避免例外,那么它首先不会引起它。

如果您可以对异常执行某些操作,请使用对象。如果你只是要杀死程序(或者某个子集,比如一个Web请求),那么就省去了提出一个精心设计的对象层次结构的努力,这些对象除了包含一条消息之外什么都没有。

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

如果你想使用对象,只需做一些非常无聊的die Object->new( ... )。它可能并不像某些超级棒的魔法那样令人兴奋,但它始终有效,而且代码完全符合它的说法。