Carp::Clan でエラーハンドリングのススメ

Carp, Carp::Clan で共通のこと

carp
呼び出し元の分かる warn
cluck
carp + stack backtrace
croak
呼び出し元の分かる die
confess
croak + stack backtrace

但し Carp の場合は cluckconfess を明示的に使うよりも、

$ perl -MCarp=verbose target.pl

という使い方でも stacktrace を得ることが出来ます。Carp::Clan の場合は、

use Carp::Clan;

$Carp::Clan::Verbose = 1 if $ENV{DEBUG};

のようなフラグで判別すると良いでしょう。

Carp::Clan のススメ

Carp::Clan の場合ですと、デフォルトでメッセージとファイル名、行番号だけで無く、どの package のどのサブルーチン内でエラーが起きたかも分かります。

$ perl carp.pl
warning message!!! at carp.pl line 17
$ perl carp_clan.pl
NS::A::do_a(): warning message!!! at carp_clan.pl line 19

という具合です。具体的なコードでは、

#!/usr/bin/perl

use strict;
use warnings;

package NS::A;

use Carp::Clan;

$Carp::Clan::Verbose = 1 if $ENV{DEBUG};

sub do_a {
    croak('warning message!!!');
}

package NS::B;

sub do_b {
    NS::A::do_a();
}

package NS::C;

sub do_c {
    NS::B::do_b();
}

package main;

NS::C::do_c();

のような形になります。またエラーハンドリングの package 名に対する正規表現によるグルーピングもできます。詳しくは perldoc Carp::Clan を見て下さい。

次は id:kazuhooku さん。