« 東方煌十夜リリーシナリオ仮公開版(5話まで) | メイン | ページをめくるモジュール »

2006年01月19日

Perlで例外処理 [Perl]

Perlは try~catch による例外処理には対応していないとばかり思っていたのだけれど、CPANにあるError.pm を使えば、ちゃんとした例外処理が出来ることが判明した。

try~catchを使わないとObjectiveなプログラムではエラー処理にとりわけ困るので、こういうのは非常に助かる。というか、もっと早くから気づいていれば。と思った。

使い方としては、

package TestError;   # 例外クラス名
use base qw/Error::Simple/;
use overload '""' => sub { shift->stacktrace };

という感じに Error::Simple を継承した例外クラスを定義して、好きなときに throw で投げる。

TestError->throw('エラーメッセージ');

投げた例外を拾わなければ通常のエラーと同じようにエラー出力されるが、当然のことながら投げられたエラーは catch することができる。

use Error qw(:try);
use TestError;  # 自分で作った Error クラス

try{
   &hogeFunction;        # TestErrorを投げてくるメソッド;
   print "例外なし";     # 例外が起きなければ、ここには到達しない
}catch TestError with{
   my $e = shift;        # このブロックで catch できる
   print "catch!\n";
   print $e->text,"\n";  # text フィールドにはエラーメッセージが格納されている
   throw $e;             # さらに投げ返してやることも
};

sub hogeFunction{
  TestError->throw('問答無用で投げてみる');
}

これを出力してみると、

catch!
問答無用で投げてみる
問答無用で投げてみる at testconf.pl line 14.

となる。2行目は $e->text で取り出した例外メッセージ、3行目は STDERR のエラー表示だ。ここまで試してみた限りでは、もう立派な例外処理が Perl で実現可能なことが分かる。これは凄い!

ただ、難点を言えば Error は標準モジュールではないことだ。しかし Error.pm をカレントディレクトリに置くだけでインストール作業無しにすぐ使えるので、それほど問題とはならない。

現在PerlでWebアプリケーションにおける基本的なクラスを大量に構築しているところなので、早速使ってみようかと思う。

投稿者 : 16:59 | コメント (0) | トラックバック (0)

トラックバック

このエントリーのトラックバックURL:
http://totora.jpn.org/mt/mt-tb.cgi/96

コメント