我有很多关于人们如何在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;
}
Run Code Online (Sandbox Code Playgroud)
此模式用于许多CPAN模块.但是perlvar说:
由于实现故障,$ SIG { DIE }挂钩甚至在eval()内部被调用.不要使用它来重写$ @中的挂起异常,或者作为重写CORE :: GLOBAL :: die()的奇怪替代.远程的这种奇怪动作可以在将来的版本中修复,这样只有当你的程序即将退出时才会调用$ SIG { DIE },就像原始意图一样.任何其他用途都已弃用.
所以现在我想知道在sigdie中对异常进行客观化是邪恶的.
你使用异常对象吗?如果是这样,哪一个和为什么?如果没有,为什么不呢?
如果您不使用异常对象,会有什么诱使您使用它们?
如果您确实使用了异常对象,那么您对它们有何厌恶,哪些更好?
在DIE处理程序中对异常进行客观化是一个坏主意吗?
我应该在哪里客观化我的例外情况?在我的eval {}包装器中?在一个sigdie处理程序?
是否有任何关于例外情况的文章,文章或其他资源,以及您发现有用或有启发性的Perl.
在Perlmonks交叉发布.
我不经常使用异常对象; 主要是因为字符串通常就足够了,所以工作量较少.这是因为程序通常无法对异常做任何事情.如果它可以避免例外,它不会首先引起它.
如果您可以对异常执行某些操作,请使用对象.如果你只是要杀死程序(或某个子集,比如一个Web请求),那么就省去了提出一个精心设计的对象层次结构的努力,这些对象除了包含一个消息之外什么也不做.
至于4号; $SIG{__DIE__}永远不应该使用.它没有构成; 如果一个模块期望sigdie以一种方式工作,并且另一个模块被加载以使其以其他方式工作,则这些模块不再能够在同一程序中使用.所以不要这样做.
如果你想使用对象,那就做一些非常无聊的事情吧die Object->new( ... ).它可能并不像某些超级棒的神奇魔法那样令人兴奋,但它始终有效并且代码完全按照它所说的完成.
| 归档时间: |
|
| 查看次数: |
1285 次 |
| 最近记录: |