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

标签 perl exception

我有很多关于人们如何在 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 中客观化异常是否是邪恶的。

问题
  • 你使用异常对象吗?如果是这样,是哪一个?为什么?如果不是,为什么不呢?
  • 如果你不使用异常对象,什么会诱使你使用它们?
  • 如果你确实使用异常对象,你讨厌它们什么,还有什么可以更好?
  • 在 DIE 处理程序中客观化异常是一个坏主意吗?
  • 我应该在哪里客观化我的异常(exception)?在我的 eval{} 包装器中?在 sigdie 处理程序中?
  • 是否有任何关于一般性和 Perl 中的异常的论文、文章或其他资源对您有用或有启发性。

  • 交叉发布于 Perlmonks .

    最佳答案

    我不经常使用异常对象;主要是因为字符串通常就足够了并且涉及的工作更少。这是因为程序通常对异常无能为力。如果它可以避免异常,那么它一开始就不会导致它。

    如果您可以对异常做点什么,请使用对象。如果您只是要终止程序(或某个子集,例如 web 请求),请省去想出一个复杂的对象层次结构的工作,这些对象除了包含一条消息之外什么也不做。

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

    如果你想使用对象,只需执行非常无聊的 die Object->new( ... ) .它可能不像某处的某种 super 神奇的魔法那样令人兴奋,但它总是有效的,并且代码完全按照它所说的那样做。

    关于perl - 你在你的 Perl 程序中使用异常类吗?为什么或者为什么不?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2439966/

    相关文章:

    java - 如何在java类中处理和显示DataDecodeException日志

    java - 顶层异常处理

    perl - 使用 xml 模块时对 "pseudo-hashes are deprecated"进行故障排除

    perl - 在perl中如何在不使用XS的情况下写入调用者的变量?

    mysql - 自 MySQLd 5.1.63 以来,MySQL 的 mytop Perl 监视器在查询/问题方面不再有效?

    python - Django:如何记录管理命令的异常?

    java - 删除列表中的所有非唯一成员

    perl - 如何使用Perl的XML::LibXML提取标记中的属性?

    perl - 需要 Perl 语法的解释

    java - Spring TransactionRequiredException 异常