将继续执行eval之后的代码(死于“某些错误消息”)吗?

时间:2013-12-02 08:17:59

标签: perl eval die

我知道在java语言中,如果成功捕获异常,try-catch子句之后的代码仍将运行。在perl中,它使用eval来捕获异常。所以,我编写了两个简单的程序来测试它

testEval1.pl:

 $exp = '$i = 3; die "error message"; $k = $i + $j';

push ( @program, '$i = 3; die "error message"; $k = $i + $j');
 $rtn =eval($exp);
    if ( ! defined ( $rtn))
    {
       print "Exception: " , $@,"\n";
    }
    else
    {
       print $rtn,"\n";
    }

testEval1.pl的输出:

code continue to run after die!
Exception: error message at (eval 1) line 1.

testEval2.pl

$baseDir = "/home/wuchang/newStore1";
my $eval_rtn = eval(opendir(BASEDIR,$baseDir) or die "dir doesn't exist!\n");
print "code continue to run after die!\n";
if(!defined($eval_rtn)){
print $@;
}
 else
    {
       print $rtn,"\n";
    }

testEval2.pl的输出:

dir doesn't exist!

你可以看到,在两个代码示例中,eval的代码块都有die表达式。但是在testEval1.pl中,eval之后的代码可以被执行,而在testEval2.pl中,它不是! 所以,我的问题是,有什么区别? 即使发生“dir不存在”异常,我该怎么做才能使程序继续运行?

谢谢。

2 个答案:

答案 0 :(得分:4)

您正在评估

的结果
opendir(BASEDIR,$baseDir) or die "dir doesn't exist!\n"

代码。如果成功则相当于eval(1)

你想要的是eval BLOCK

my $eval_rtn = eval{ opendir(BASEDIR,$baseDir) or die "dir doesn't exist!\n" };

检查perldoc -f eval以查看eval EXPReval BLOCK

之间的差异

答案 1 :(得分:3)

回答你的问题标题:

  

eval之后的代码(死于“某些错误消息”)会继续执行吗?

答案是“不”。但请继续阅读,因为这不是问题,而是对所涉及的Perl语法的误解。

该行:

my $eval_rtn = eval( opendir(BASEDIR,$baseDir) or die "dir doesn't exist!\n" );

无法运行eval。您与(..)括号一起使用的语法采用标量值,在eval执行任何操作之前,它等待opendir...or die表达式返回一个字符串(这将是评估)。为了使它与您的其他示例等效,您可以将参数设为字符串:

my $eval_rtn = eval( q{opendir(BASEDIR,$baseDir) or die "dir doesn't exist!\n"} );

您也可以使用块形式:

my $eval_rtn = eval { opendir(BASEDIR,$baseDir) or die "dir doesn't exist!\n"; };

我建议尽可能使用块表单,它通常更容易调试,在您的情况下更好地匹配您想要实现的异常处理语义。