这是从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
),但使用$_
返回错误消息是一个好方法?我没有找到任何关于$_
用于此类目的的文档。
谢谢!
答案 0 :(得分:22)
$_
不是一个很好的机制,因为许多其他东西都使用和设置它。
您可以设置一些其他全局变量,例如$ Error,但最好的方法是抛出异常。然后用户不必总是检查,忘记,它只是发生。在Perl中,使用“die”生成异常。 die会带一个字符串或一个对象。有许多模块可以简化抛出异常,包括Exception::Class,Exception::Simple,Ouch和autodie。
您可以使用eval {}捕获异常,但有a number of problems with that,因此您应该使用Try::Tiny之类的内容。
答案 1 :(得分:7)
使用全局变量来保存错误消息并不是未知数。例如,内置函数使用$!
,而DBI使用$DBI::errstr
。但是你继承了使用全局变量的所有问题。信号处理程序需要对它们进行本地化,析构函数可能会破坏它们,多线程问题等。
在我看来,抛出异常(例如使用die
)是一种更常见的选择。
无论你做什么,都不要使用$_
。它经常被别名,所以使用它会产生意想不到的后果。
答案 2 :(得分:2)
你可以做的一件事就是在错误/未定义的结果上简单地return;
。有些情境可以将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);
你有一个奇怪的错误(没有发现错误)可能很难追查,而如果你从return;
some_subroutine
获得:
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;
允许对几乎所有函数使用一种模式,既可以返回适当的值又可以在何时返回检查错误状态。
答案 3 :(得分:1)
这完全取决于您希望从错误处理程序中看到的行为。在发生运行时错误/警告的情况下,使用die
或warn
在perl中非常常见。
在perl中查看有关错误处理的本教程:http://www.tutorialspoint.com/perl/perl_error_handeling.htm
答案 4 :(得分:0)
对于Web服务,您可以编写一个子例程来打印自定义错误响应(40x错误等)。