I know that in java language ,if an exception is catched successfully ,the code after the try-catch-clause will still run.In perl ,it uses eval to catch exception.So ,I write two simple programs to test it.
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";
}
output of 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";
}
output of testEval2.pl:
dir doesn't exist!
you can see that in the two code examples , the code block of eval both has die expressions.But in testEval1.pl,the code after eval can be excuted,while in testEval2.pl,it's not! So ,my question is ,what's the difference ? What can I do to make the program continue to run even if a "dir doesn't exist" exception happeded ?
thank you.
You're evaling result of
opendir(BASEDIR,$baseDir) or die "dir doesn't exist!\n"
code. If it would succeed that would be equivalent of eval(1)
.
What you want is eval BLOCK
:
my $eval_rtn = eval{ opendir(BASEDIR,$baseDir) or die "dir doesn't exist!\n" };
Check perldoc -f eval for difference between eval EXPR
and eval BLOCK
To answer your question title:
Will code after eval(die “some error message”) continue to be executed?
The answer is "No". But please read on, because this is not a problem, but a misunderstanding about the Perl syntax involved.
The line:
my $eval_rtn = eval( opendir(BASEDIR,$baseDir) or die "dir doesn't exist!\n" );
Does not get as far as running the eval
. The syntax you have used with (..)
brackets takes a scalar value, and before the eval
does anything at all, it is waiting for the opendir...or die
expression to return a string (which will then be evaluated). To make it equivalent to your other example, you could make the param a string:
my $eval_rtn = eval( q{opendir(BASEDIR,$baseDir) or die "dir doesn't exist!\n"} );
You could also use the block form instead:
my $eval_rtn = eval { opendir(BASEDIR,$baseDir) or die "dir doesn't exist!\n"; };
I would recommend using the block form where possible, it is usually easier to debug, and in your case better matches the exception handling semantics that you want to achieve.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With