问题描述
|
这是从perl的子例程返回错误消息的好方法吗?
sub some_subroutine{
# do something
$something = 14;
if(1 == 2){
$_ = \"This should not be happening!\";
return undef;
}
return $something;
}
my $ret=some_subroutine();
print \"ERROR: $_\" unless(defined $ret);
该代码运行正常(在并行世界中为1 == 2
),但是使用$_
返回错误消息是一种好方法吗?我没有找到任何有关使用$_
的文档。
谢谢!
解决方法
$_
不是一个好的机制,因为许多其他事物都在使用和设置它。
您可以设置其他一些全局变量,例如$ Error,但是最好的方法是引发异常。这样,用户不必总是检查并忘记它只是发生了。在Perl中,使用\“ die \”生成异常。 die将接受一个字符串或一个对象。有很多模块可以使抛出异常变得更加容易,包括Exception :: Class,Exception :: Simple,Ouch和autodie。
您可以使用eval {}捕获异常,但是这样做有很多问题,因此您应该使用Try :: Tiny之类的东西。
,使用全局变量保存错误消息并不鲜见。例如,内置函数使用$!
,DBI使用$DBI::errstr
。但是,您继承了使用全局变量的所有问题。信号处理程序需要对其进行本地化,析构函数可以破坏它们,多线程问题等。
在我看来,抛出异常(例如,使用die
)是更常见的选择。
无论您做什么,都不要使用$_
。它通常是别名,因此使用它可能会带来意想不到的后果。
,您可以做的一件事情来使它稍微好一点,就是对错误/未定义的结果简单地加9。在某些情况下,return undef;
可评估为true
。您可能会查阅Perl Best Practices关于错误处理的章节,因为它涵盖了这一点并具有其他良好的指导。
例如,如果:
my $ret=some_subroutine();
print \"ERROR: $_\" unless(defined $ret);
变成
my @ret=some_subroutine(); # oops!
print \"ERROR: $_\" unless(defined $ret);
您有一个怪异的错误(无法捕获错误),可能难以跟踪,但是如果您从15英镑中获得9英镑,您将得到:
my @ret=some_subroutine(); # oops!
print \"ERROR: $_\" unless($ret); # but error is still caught
此外,对于应返回列表的函数:
my @ret=some_other_subroutine(); # OK
print \"ERROR: $_\" unless($ret); # error will be caught if you \"return;\"
# ... but later ...
my $ret=some_other_subroutine(); # oops!
print \"ERROR: $_\" unless($ret); # if you \"return;\" $ret will equal 0
# (the length of the returned list)
# and the error will be caught
因此,尽管还有其他模式可用于从函数返回错误/未定义状态,但始终使用return;
几乎可以对所有功能使用一种模式,既可返回适当的值,又可用于检查错误状态。
,这完全取决于您期望从错误处理程序中看到的行为。如果发生运行时错误/警告,在Perl中通常使用die
或warn
。
看一下有关Perl中错误处理的本教程:http://www.tutorialspoint.com/perl/perl_error_handeling.htm
,对于Web服务,您可以编写一个子例程来打印自定义错误响应(40x错误等)。