Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl eval(die“some error message”后的代码是否会继续执行?_Perl_Eval_Die - Fatal编程技术网

Perl eval(die“some error message”后的代码是否会继续执行?

Perl eval(die“some error message”后的代码是否会继续执行?,perl,eval,die,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 (

我知道在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";
    }
code continue to run after die!
Exception: error message at (eval 1) line 1.
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";
    }
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不存在”异常,如何使程序继续运行


谢谢。

回答您的问题标题:

eval(死“一些错误消息”)后的代码是否会继续执行

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

该行:

my $eval_rtn = eval( opendir(BASEDIR,$baseDir) or die "dir doesn't exist!\n" );
无法运行
eval
。与
(..)
方括号一起使用的语法采用标量值,在
eval
执行任何操作之前,它正在等待
opendir…或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"; };

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

您正在评估

opendir(BASEDIR,$baseDir) or die "dir doesn't exist!\n"
代码。如果成功,这相当于
eval(1)

您需要的是
评估块

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

检查
eval EXPR
eval BLOCK

之间的差异,如果您想要稍微更像Java的
try catch
语法,请查看。感谢您的通知。这很有用。因此,对于$rtn=eval($exp);这是一种EVE块还是EVE EXPR?我可以得出结论,因为EXP是由一个单一的引用包围的,所以它是一个EVE块?对吗?@ VigoSoWu认为Engle用括号:<代码> Ev{{} /Case>作为EVAL块,并且其他所有的都是EVAXEPR。因此,对于表达式EVE(OpenDIR(BaseDeR,$BaseDR)或DeR”不存在!\n);eval只是得到一个字符串作为参数,因此与eval(1)的工作方式相同?@Vico_-Wu:是的。虽然如果成功,
opendir
将返回除
1
以外的内容,但这是基本问题。