#!/usr/local/bin/perl
# $Id: except.perl,v 1.5 2001/05/27 00:23:52 doug Exp $
# http://www.bagley.org/~doug/shootout/
use integer;
my $HI = 0;
my $LO = 0;
my $NUM = $ARGV[0];
$NUM = 1 if ($NUM < 1);
package Lo_Exception;
sub new {
bless({Val => shift}, __PACKAGE__);
}
package Hi_Exception;
sub new {
bless({Val => shift}, __PACKAGE__);
}
package main;
sub some_function {
my $num = shift;
eval {
&hi_function($num);
};
if ($@) {
die "We shouldn't get here ($@)";
}
}
sub hi_function {
my $num = shift;
eval {
&lo_function($num);
};
if (ref($@) eq "Hi_Exception") {
$HI++; # handle
} elsif ($@) {
die $@; # rethrow
}
}
sub lo_function {
my $num = shift;
eval {
&blowup($num);
};
if (ref($@) eq "Lo_Exception") {
$LO++; # handle
} elsif ($@) {
die $@; # rethrow
}
}
sub blowup {
my $num = shift;
if ($num % 2) {
die Lo_Exception->new(Num => $num);
} else {
die Hi_Exception->new(Num => $num);
}
}
$NUM = $ARGV[0];
while ($NUM--) {
&some_function($NUM);
}
print "Exceptions: HI=$HI / LO=$LO\n";