ただし、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 件のコメント:
コメントを投稿