1

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

4 回答 4

6

例外不在eval中,它在下面的行中,&@是错误的顺序,你的意思是$@

UPD:请注意,当您有严格的 on 并且 $fh 是 undef 时, close可能会死掉,我认为这不是正常情况(算法错误)。

于 2012-11-15T18:55:45.260 回答
4

也许你的意思是$@而不是&@?后者将被解释为子程序。

于 2012-11-15T18:56:01.513 回答
0

你应该使用$@而不是&@. 请参阅此链接以查看 Perl 的所有特殊变量都有什么。

$@表示来自最后一个 eval、do-FILE 或 require 命令的 Perl 语法错误或例程错误消息。如果设置,则编译失败,或者 die 函数在 eval 的代码中执行。

于 2012-11-15T19:55:39.910 回答
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";

该程序安静地运行并在最后执行打印语句。

于 2012-11-17T04:23:08.093 回答