从perl子例程返回错误消息

问题描述

| 这是从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错误等)。