我有很多关于人们如何在 Perl 中使用异常的问题。我已经包含了一些有关例外情况的背景说明,如果您愿意,可以跳过此内容,但请花点时间阅读问题并做出答复。
Thanks.
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 中的异常的论文、文章或其他资源,您认为有用或有启发性。
交叉发布于佩尔蒙克斯 http://perlmonks.org/?node_id=828478.
我不经常使用异常对象;主要是因为字符串通常就足够了并且涉及的工作较少。这是因为程序通常对异常无能为力。如果它可以避免异常,那么它一开始就不会导致异常。
如果您可以对异常采取一些措施,请使用对象。如果您只是要终止程序(或某个子集,例如 Web 请求),那么您就不必费力去设计一个复杂的对象层次结构,这些对象除了包含一条消息之外什么也不做。
至于4号;$SIG{__DIE__}
永远不应该使用。它不作曲;如果一个模块期望 sigdie 以一种方式工作,而加载另一个模块使其以其他方式工作,则这些模块不能再在同一程序中使用。所以不要这样做。
如果你想使用对象,就做非常无聊的事情die Object->new( ... )
。它可能不像某个地方的超级神奇魔法那样令人兴奋,但它总是有效,并且代码完全按照它所说的那样执行。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)