从perl子例程返回错误消息

时间:2011-04-14 23:10:40

标签: 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),但使用$_返回错误消息是一个好方法?我没有找到任何关于$_用于此类目的的文档。

谢谢!

5 个答案:

答案 0 :(得分:22)

$_不是一个很好的机制,因为许多其他东西都使用和设置它。

您可以设置一些其他全局变量,例如$ Error,但最好的方法是抛出异常。然后用户不必总是检查,忘记,它只是发生。在Perl中,使用“die”生成异常。 die会带一个字符串或一个对象。有许多模块可以简化抛出异常,包括Exception::ClassException::SimpleOuchautodie

您可以使用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)

这完全取决于您希望从错误处理程序中看到的行为。在发生运行时错误/警告的情况下,使用diewarn在perl中非常常见。

在perl中查看有关错误处理的本教程:http://www.tutorialspoint.com/perl/perl_error_handeling.htm

答案 4 :(得分:0)

对于Web服务,您可以编写一个子例程来打印自定义错误响应(40x错误等)。