【发布时间】: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 中客观化异常是否是邪恶的。
问题
您是否使用异常对象?如果是这样,是哪一个?为什么?如果没有,为什么不呢?
如果您不使用异常对象,什么会吸引您使用它们?
如果您确实使用异常对象,您讨厌它们的什么地方,还有什么更好的地方?
在 DIE 处理程序中客观化异常是个坏主意吗?
我应该在哪里客观化我的例外?在我的 eval{} 包装器中?在 sigdie 处理程序中?
是否有任何关于一般异常和 Perl 中的异常的论文、文章或其他资源对您有用或有启发性。
在Perlmonks 交叉发布。
【问题讨论】:
-
感谢您的链接,以太。我读了一本,并煽动了另一本。我真的很想看到各种各样的意见;从“我讨厌他们,他们让我的牙齿变绿了”到“我喜欢他们并且总是使用 exception::Foo::Blarg '因为它会洗碗。”