我知道在
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不存在”异常,我该怎么做才能使程序继续运行?
谢谢.
解决方法
你正在评估结果
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 EXPR和eval BLOCK之间的差异