Translate

2013年8月18日日曜日

エラー情報は、発生行?呼出し行 warn/die or carp/croak

まずは、Debugモジュールを作成し、Printするメソッドを定義します。
ただし、Printする文字列がない時つまり引数が渡されなかったらエラーで終了としましょう!

use strict;                                                                              
use warnings;
use utf8;
use feature 'say';
binmode STDOUT, ":utf8";
binmode STDERR, ":utf8";

my $obj = Debug->new();
say $obj->Print("abc");
say $obj->Print("def");
say $obj->Print();
say $obj->Print("ghi");

package Debug;

sub new{                                                                                  
    return bless {}, shift;
}

sub Print{
    my ($self, $str) = @_;
    if (@_!=2){ die("引数を一つだけ指定してください") };

    return $str;
}

これを実行するとエラーで落ちます。
abc
def
引数を一つだけ指定してください at sample.pl line 22.

確かにエラーが発生した行の情報が表示されていて
これはこれで正しいのですが、あちこちから呼ばれる、データがトリガーとなって
エラーとなるケースでは呼び出しもとがどこなのか知りたいですよね。
つまり、呼び出しもとの行数を知りたい。
そんな時は、Carpモジュール。

use strict;                                                                              
use warnings;
use utf8;
use feature 'say';
binmode STDOUT, ":utf8";
binmode STDERR, ":utf8";

my $obj = Debug->new();
say $obj->Print("abc");
say $obj->Print("def");
say $obj->Print();
say $obj->Print("ghi");

package Debug;
use Carp;

sub new{                                                                                  
    return bless {}, shift;
}

sub Print{
    my ($self, $str) = @_;
    if (@_!=2){ croak("引数を一つだけ指定してください") };

    return $str;
}

実行結果:
abc
def
引数を一つだけ指定してください at sample.pl line 11.

引数を一つだけ指定してください。といわれ11行を確認すると
say $obj->Print();
ならば修正するのも楽ですね。

warnの代わりはcarpで
dieの代わりはcroakとなっています。

ロジックに問題の可能性があればwarnやdieを使い
呼び出し元がトリガーとなる場合carpやcroakを適宜使い分ければよいと思います。

0 件のコメント:

コメントを投稿