分配给$是否可以!在Perl中出错?
,例如,
if( ! (-e $inputfile))
{
$! = "Input file $inputfile appears to be non-existent\n";
return undef;
}
这样我就可以处理顶层的所有错误。
感谢。
答案 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)
设置$!
很好,但是:
需要记住的是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模块。