从perl子例程返回错误消息

Gog*_*ent 14 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);
Run Code Online (Sandbox Code Playgroud)

代码运行正常(在并行世界中,在哪里1 == 2),但使用$_返回错误消息是一个好方法?我没有找到任何关于$_此类用途的使用文档.

谢谢!

Sch*_*ern 23

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

您可以设置一些其他全局变量,如$ Error,但最好的方法是抛出异常.然后用户不必总是检查,忘记,它只是发生.在Perl中,使用" die " 生成异常.die会带一个字符串或一个对象.有许多模块可以让抛出异常更容易,包括Exception :: Class,Exception :: Simple,Ouchautodie.

您可以使用eval {}捕获异常,但是有很多问题,所以你应该使用像Try :: Tiny这样的东西.

  • ...如果较大的系统没有丢失该文件,你可以在它周围放置一个包装器来检查文件是否存在,如果没有则返回空结构.最后,程序员将忘记编写错误处理代码,但您必须故意忽略异常.它针对懒惰进行了优化. (4认同)
  • @SoloBold不要因为"异常"的确切含义而过于紧张.如果子程序无法完成其工作,那么这是一个例外情况.如果这意味着调用者不能期望正常的返回值,那么这是一个例外情况.如果你编写一个检查文件是否存在的子程序,那么如果它不在那里就不例外.如果您编写一个读取和解析文件的例程,如果该文件不存在则应该抛出异常. (3认同)

ike*_*ami 8

使用全局变量来保存错误消息并不是未知数.例如,内置函数使用$!和DBI使用$DBI::errstr.但是你继承了使用全局变量的所有问题.信号处理程序需要对它们进行本地化,析构函数可能会破坏它们,多线程问题等.

在我看来,抛出异常(例如使用die)是一种更常见的选择.

无论你做什么,都不要使用$_.它经常被别名,所以使用它可能会产生意想不到的后果.