为什么Perl没有捕获此异常?
my $fh;
eval { close $fh };
warn('Caught') if &@;
输出:
Can't use an undefined value as a symbol reference at New_test.pl line 30.
更新:没有警告线和eval { close $fh };
的相同输出是第30行。
答案 0 :(得分:6)
例外情况不在 eval 中,其在{@ 1}}下面是错误的序列,您的意思是&@
UPD:注意关闭可以死,当你有严格时,$ fh是undef,我认为这不是正常情况(一个算法bug)。
答案 1 :(得分:4)
也许你的意思是$@
而不是&@
?后者将被解释为子程序。
答案 2 :(得分:0)
您应该使用$@
而不是&@
。
请参考this link以了解Perl的所有特殊变量。
$@
表示来自上一个eval,do-FILE或require命令的Perl语法错误或例程错误消息。如果设置,则编译失败,或者在eval的代码中执行die函数。
答案 3 :(得分:0)
eval块确实捕获异常并防止它致命。
例如:
#!/usr/bin/perl -Tw
use strict;
use warnings;
my $fh;
close $fh;
print "done\n";
该程序在关闭执行时会以预期的消息消失。 为了比较:
#!/usr/bin/perl -Tw
use strict;
use warnings;
my $fh;
eval { close $fh; };
print "done\n";
这个程序安静地运行并在最后执行print语句。