Error Handling and Defensive Perl
Guarded Operation
Check a divisor before calculating.
guarded-operation
A guard branch can turn a risky calculation into a clear status.
Guarded Operation
guarded_operation.pl
Replay: real traced execution (multi-file project)
use strict;
use warnings;
my $denominator = 2;
my $status;
my $result;
if ($denominator == 0) {
$status = "blocked";
$result = "n/a";
} else {
$status = "ok";
$result = 20 / $denominator;
}
print "denominator=$denominator\n";
print "status=$status\n";
print "result=$result\n";
use strict;
use warnings;
my $denominator = 0;
my $status;
my $result;
if ($denominator == 0) {
$status = "blocked";
$result = "n/a";
} else {
$status = "ok";
$result = 20 / $denominator;
}
print "denominator=$denominator\n";
print "status=$status\n";
print "result=$result\n";
use strict;
use warnings;
my $denominator = 5;
my $status;
my $result;
if ($denominator == 0) {
$status = "blocked";
$result = "n/a";
} else {
$status = "ok";
$result = 20 / $denominator;
}
print "denominator=$denominator\n";
print "status=$status\n";
print "result=$result\n";
$denominator ← 2, $status ← (empty), $result ← (empty)
4my $denominator→ 2 = 2; #@denominator=0, 55my $status→ (empty);6my $result→ (empty);$status ← ok, $result ← 10
10 $result = "n/a";11} else {12 $status→ ok = "ok";13 $result→ 10 = 20 / $denominator2;14}print "denominator=$denominator ";
16print "denominator=$denominator2\n";17print "status=$statusok\n";18print "result=$result10\n";outputdenominator=2 status=ok result=10
$denominator ← 0, $status ← (empty), $result ← (empty)
4my $denominator→ 0 = 0;5my $status→ (empty);6my $result→ (empty);$status ← blocked, $result ← n/a
8if ($denominator0 == 0) {9 $status→ blocked = "blocked";10 $result→ n/a = "n/a";11} else {print "denominator=$denominator ";
16print "denominator=$denominator0\n";17print "status=$statusblocked\n";18print "result=$resultn/a\n";outputdenominator=0 status=blocked result=n/a
$denominator ← 5, $status ← (empty), $result ← (empty)
4my $denominator→ 5 = 5;5my $status→ (empty);6my $result→ (empty);$status ← ok, $result ← 4
10 $result = "n/a";11} else {12 $status→ ok = "ok";13 $result→ 4 = 20 / $denominator5;14}print "denominator=$denominator ";
16print "denominator=$denominator5\n";17print "status=$statusok\n";18print "result=$result4\n";outputdenominator=5 status=ok result=4