この単純なクラスを考えてみましょう。
package Foo;
use Moose;
has foo => ( is => 'rw', isa => 'Int' );
そして、このコード:
use Try::Tiny;
use Foo;
my $f = try {
Foo->new( foo => 'Not an Int' );
}
catch {
warn $_;
};
コードは、型制約の失敗に関する大きなエラーメッセージで終了します。
情報を取得するためにエラー文字列を解析することなく、失敗した属性( foo
)、理由(失敗した型制約)、および渡された値()を抽出できるようにしたいと思います。Not an Int
このようなもの:
catch {
if( $_->isa( 'MooseX::Exception::TypeConstraint' ) ) {
my $attrib = $_->attribute;
my $type = $_->type;
my $value = $_->bad_value;
warn "'$value' is an illegal value for '$attrib'. It should be a $type\n";
}
else {
warn $_;
}
};
これは可能ですか?これを実現できるMooseXディストリビューションはありますか?さらに良いことに、これを可能にする、私が見逃したいくつかのMoose機能はありますか?
更新:私は特に型の制約に興味がありますが、他のMooseエラーも非常に良いでしょう。また、。を使用してオブジェクトをスローできることも認識していますdie
。したがって、私が作成するコードで例外を構造化するのは比較的簡単です。