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