我有很多关于人们如何在 Perl 中使用异常的问题。我已经包含了一些关于异常(exception)的背景说明,如果您愿意,请跳过此部分,但请花点时间阅读问题并做出回应。
谢谢。
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 说:
Due to an implementation glitch, the $SIG{DIE} hook is called even inside an eval(). Do not use this to rewrite a pending exception in $@ , or as a bizarre substitute for overriding CORE::GLOBAL::die() . This strange action at a distance may be fixed in a future release so that $SIG{DIE} is only called if your program is about to exit, as was the original intent. Any other use is deprecated.
所以现在我想知道在 sigdie 中客观化异常是否是邪恶的。
问题
交叉发布于 Perlmonks .
最佳答案
我不经常使用异常对象;主要是因为字符串通常就足够了并且涉及的工作更少。这是因为程序通常对异常无能为力。如果它可以避免异常,那么它一开始就不会导致它。
如果您可以对异常做点什么,请使用对象。如果您只是要终止程序(或某个子集,例如 web 请求),请省去想出一个复杂的对象层次结构的工作,这些对象除了包含一条消息之外什么也不做。
至于4号; $SIG{__DIE__}
永远不应该使用。它不组成;如果一个模块期望 sigdie 以一种方式工作,并且加载了另一个模块使其以其他方式工作,则这些模块不能再在同一个程序中使用。所以不要那样做。
如果你想使用对象,只需执行非常无聊的 die Object->new( ... )
.它可能不像某处的某种 super 神奇的魔法那样令人兴奋,但它总是有效的,并且代码完全按照它所说的那样做。
关于perl - 你在你的 Perl 程序中使用异常类吗?为什么或者为什么不?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2439966/