Perl eval没有捕获异常

时间:2012-11-15 18:52:46

标签: perl exception exception-handling

为什么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行。

4 个答案:

答案 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语句。