为什么 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 行。
为什么 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 行。
例外不在eval中,它在下面的行中,&@
是错误的顺序,你的意思是$@
UPD:请注意,当您有严格的 on 并且 $fh 是 undef 时, close可能会死掉,我认为这不是正常情况(算法错误)。
也许你的意思是$@
而不是&@
?后者将被解释为子程序。
你应该使用$@
而不是&@
. 请参阅此链接以查看 Perl 的所有特殊变量都有什么。
$@
表示来自最后一个 eval、do-FILE 或 require 命令的 Perl 语法错误或例程错误消息。如果设置,则编译失败,或者 die 函数在 eval 的代码中执行。
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";
该程序安静地运行并在最后执行打印语句。