我学习的Perl,并在很多我看到错误的例子是这样Perl中错误处理的最佳实践是什么?
open FILE, "file.txt" or die $!;
的处理是在脚本中间die
真正处理错误的最好方法?
我学习的Perl,并在很多我看到错误的例子是这样Perl中错误处理的最佳实践是什么?
open FILE, "file.txt" or die $!;
的处理是在脚本中间die
真正处理错误的最好方法?
更现代的方法是使用鲤鱼标准库。
use Carp;
my $fh;
open $fh, '<', "file.txt" or confess($!);
它的主要优点是它给死亡的堆栈跟踪。
,除非你设置了一些其他的鲤鱼东西,否则cro鱼不会给出堆栈跟踪。 – 2010-05-19 20:58:17
@brian:whoop,固定。 – 2010-05-19 20:59:24
谢谢!我不知道鲤鱼......但是从什么时候开始鲤鱼呱呱叫? – SystematicFrank 2010-05-19 20:59:41
我使用模具,但我把它包装的eval块在错误处理控制:
my $status = eval
{
# Some code...
};
如果 'EVAL' 失败:
$status
将是不确定的。[email protected]
将被设置的任何错误消息被产生的(或 一个die
的内容)如果“EVAL”成功:
$status
将是最后一个返回值块。[email protected]
将被设置为''。'eval {}'有很多问题需要隐晦的解决方法。改用Try :: Tiny。它将所有有害的样板包裹在干净,易于使用的包装中。 – daotoad 2010-05-19 21:54:24
eval {}'有很多问题需要隐晦的解决方法...如果您关心识别错误。如果你打算采取同样的行动,不管其原因如何,一个简单的块'eval'工作正常。但是,是的:在所有其他情况下使用'Try :: Tiny'。 – 2010-05-20 09:40:36
下次我编写一些Perl时,我会尝试一下。我使用这种方式来伪造try-catch(通过在eval块之后添加$ @的检查。)感谢提示。 – 2010-05-20 14:23:31
由于我几乎在任何地方都使用Log::Log4perl,所以我用$logger->logdie
代替die
。如果您想对您的例外有更多的控制权,请考虑Exception::Class。
最好用Try::Tiny(请参阅它的文档为什么)了解您的例外情况。
除非你有一个更具体的想法,然后是的当意想不到的事情发生时,你想死。
死亡对未能打开一个文件,并给予文件名是不是系统告诉你它无法读取或写入到一个匿名未定义的更好。
如果你正在谈论一个“脚本”,一般来说你正在谈论一段非常简单的代码。不需要协调的层(通常不)。在一个Perl 模块中,有一个随之而来的想法是你不拥有执行环境,所以无论是主软件还是关心它,并且它在eval中捕获事物,或者它并不真正关心和死亡就没有问题。然而,你应该尝试一个更健壮的模块作为模块,并传回undefs或其他东西。
你可以在eval块中捕获任何死亡(或cro)声)。你可以在那里做更具体的处理。
但是如果你想检查$!那么写的代码,你会有一个更具体的决议。
看看使用strict
的近似通用标准。这是死于可疑语法的代码,而不是让你继续。
所以我觉得总体思路是:是,DIE,除非你有事情应该如何处理一个更好的主意。如果你有足够的先见之明,你可以原谅你不会死的一两次,因为你知道你不需要。
有关perl异常的讨论,请参见[有关perl中异常的细节?](http://stackoverflow.com/questions/2165161/whats-broken-about-exceptions-in-perl),[您是否使用Perl程序中的异常类?为什么或为什么?](http://stackoverflow.com/questions/2439966/do-you-use-an-exception-class-in-your-perl-programs-why-or-why-not)和[在Perl中面向对象的异常处理 - 是否值得?](http://stackoverflow.com/questions/503189/object-oriented-exception-handling-in-perl-is-it-worth-it) – Ether 2010-05-19 22:14:47