分配到$是犹太教!在Perl?

时间:2009-06-25 16:22:04

标签: perl error-handling

分配给$是否可以!在Perl中出错?

,例如,

if( ! (-e $inputfile))
{
      $! = "Input file $inputfile appears to be non-existent\n";
      return undef;
}

这样我就可以处理顶层的所有错误。

感谢。

7 个答案:

答案 0 :(得分:12)

如果您分配给$ !,它将被放置在系统errno变量中,该变量仅接受数字。所以你实际上可以这样做:

use Errno "EEXIST";
$! = EEXIST;
print $!;

并获取已定义系统错误号的字符串值,但您无法执行所需操作 - 将其设置为任意字符串。这样的字符串将为您提供参数“...”在标量赋值警告中不是数字,并将errno设置为0。

另一个问题是$!可以通过任何系统调用更改。因此,您只能相信它具有您设置的值,直到您进行打印或其他任何操作。你可能想要你自己的错误变量。

答案 1 :(得分:9)

嗯,documentation表示它基本上是系统错误的指标。所以我不会分配它,你只是让你的lib的用户疯了。

改为使用例外:

eval { # this ain't the evil eval
   # some code
   die $something;
}
if (my $err = $@) {
   # exception handling
}

请注意,你可以“抛出”或死掉任何你需要的东西..

答案 2 :(得分:3)

我的拉比说“不!”

答案 3 :(得分:3)

设置$!很好,但是:

  • 你应该在功能结束时这样做
  • 您应该返回一个表示发生错误的其他值
  • 您应该使用操作系统的errno值而不是字符串来设置目的
  • 检查代码需要检查该值是否应该在函数失败时立即执行(并且仅当函数指示失败时)

需要记住的是die使用$中的值!退出代码(只要它不为零)。

答案 4 :(得分:2)

是的,你可以将东西(#'s)分配给$!,只要警惕你在哪里这样做,这样你就不会搞砸其他一些功能信息。

答案 5 :(得分:0)

如果您只有一个变量来存储错误,那么在检查错误变量的状态之前,如果程序中出现多个错误,则会出现问题。如果你能提供帮助,这是值得的。

谢天谢地,Perl你可以帮忙。一个非常好的解决方案是使用Error.pm中面向对象的异常处理。这个模块允许你编写try / catch块,如下所示:

try {
    some code;
    code that might thrown an exception;
    more code;
    return;
}
catch Error with {
    my $ex = shift;   # Get hold of the exception object
    # handle the exception;
};

该模块的CPAN documentation非常好,并且还有关于该主题的Perl.com文章。

答案 6 :(得分:0)

$!有很多警告,作为一个全局变量,许多函数分配给它们(其中一些是Perl调用的C函数),我只是抛出一个异常(在Perl中意味着死亡)并让用户在它们关心时陷阱。所以不要写:

$obj->foo or die $!;
$obj->bar or die $!;
$obj->baz or die $!;

甚至

$obj->foo or die $obj->error;
$obj->bar or die $obj->error;
$obj->baz or die $obj->error;

你可以写

$obj->foo;
$obj->bar;
$obj->baz;

并知道如果出现错误,您会收到通知。此外,您上面的任何人都会收到通知,并且可以捕获它因为这是最常见的情况,所以如果没有用户需要记住它并一遍又一遍地输入它就会发生。

如果您想忽略或从错误中恢复,只需使用eval BLOCK

eval { $obj->foo };   # don't care if it works or not
eval { $obj->bar } or do { ...something when it doesn't work... };

由于这是特殊情况,因此用户必须记住添加更多代码并完成更多工作。

此方法的示例包括DBI's RaiseError flag,默认情况下仅为向后兼容性而关闭,以及精彩的autodie模块。