今回のコードピースは簡単すぎる。実際はより複雑な場合や、スタックトレースを活用したい場合もあり得ると思われる。そういったシーンのコードピースはまた、時間をおいてリベンジをかけたい。
#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper;
use Error qw(:try);
# 関数の中でthrowしてみる
sub t01 {
try {
throw Error(-text => "through test!!");
} catch Error with {
my $e = shift;
print "======= in t01\n";
$e->throw();
};
}
try { &t01(); } catch Error with {
my $e = shift;
print "----- in main\n";
print Dumper($e), "\n";
};
# 一段関数呼び出しを増やしてみる
sub t02 { &t01(); }
try { &t02(); } catch Error with {
my $e = shift;
print "----- in main\n";
print Dumper($e), "\n";
};
======= in t01
----- in main
$VAR1 = bless( {
'-file' => './try06.pl',
'-text' => 'through test!!',
'-line' => 12,
'-package' => 'main'
}, 'Error' );
======= in t01
----- in main
$VAR1 = bless( {
'-file' => './try06.pl',
'-text' => 'through test!!',
'-line' => 12,
'-package' => 'main'
}, 'Error' );
基本的に、多段で組んだ場合も問題なくcatchできているようである。
もともとError.pmにおいてcatchは%SIG{__DIE__}機構を用いて実現している。多段で組んでも特に問題無いと言える。