第64回 Error.pm でちょっとハマったので

第45回 Java的な例外処理 - bingo_nakanishiの他言語出身者のためのPerl入門
で、Error.pmを紹介しました。

Error.pmを使ったソース

で、今回、
次のようなコードを書いてみました。

use Error qw(:try);

try {
  die 'OH';
}otherwise{
  my $e = shift;
  print $e;
};


これを実行すると、

OH at bingo.pl line 4.

となって行番号とファイル名まで表示されてしまいます。
しかし、ここでは、dieに与えた「OH」だけが欲しいとします。

$eには何が入ったか?

$eから at以下を削除すればいいんじゃないの? 正規表現かなにかで? と思いますが、それはなんか苦しい。

ここで、$eは何者なのかDumperで覗いてみましょう。

use Error qw(:try);
use Data::Dumper;

try {
  die 'OH';
}otherwise{
  my $e = shift;
  print Dumper $e;
};

結果:

$VAR1 = bless( {
                 '-file' => 'bingo.pl',
                 '-text' => 'OH',
                 '-line' => '5',
                 '-package' => 'Error'
               }, 'Error::Simple' );

おお! $eは($eが受け取ったもの)は、
Error::Simpleというものだったことがわかります。
しかも、結果からわかるとおりError::Simpleにblessされた無名ハッシュです。


おお! '-text'というキーにdieに与えた'OH'を持っていますね。これが使えます。

dieに与えたものをとりだすには '-text'キーを使う(下記、追記も参照のこと)

use Error qw(:try);

try {
  die 'OH';
}otherwise{
  my $e = shift;
  print $e->{'-text'};
};

結果:

OH

追記

use Error qw(:try);

try {
  die 'OH';
}otherwise{
  my $e = shift;
  print $e->text;
};

結果:

OH

$e->textを使うのが正解っぽい。
Error - Error/exception handling in an OO-ish way - metacpan.org