12

この単純なクラスを考えてみましょう。

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。したがって、私が作成するコードで例外を構造化するのは比較的簡単です。

4

3 に答える 3

4

私自身は試していませんが、MooseX :: Error :: Exception::Classがあなたが探しているものかもしれないと思います。

于 2010-02-11T05:37:20.203 に答える
3

MooseX :: Throwableをチェックしてください。これはerror_class、メタクラスの値を置き換えます。コードは少し古いように見えますが(メタロールは現在エラークラスの役割をサポートしています)、現在のメソッドは引き続き機能するようです。

于 2010-02-11T00:42:04.230 に答える
1

私は約1年前に同じ質問をし、#mooseIRCチャネルで質問しました。答えは、Mooseは構造化された例外を実際にはサポートしていないということでした。

修正する必要があるのはMooseの欠点であるという一般的な合意がありますが、例外をどこにでも導入する作業は面倒で、まだ(afaik)実行されていません。

MooseX :: Error :: Exception :: Classのアプローチは、Mooseからのメッセージの解析に基づいているため、非常に脆弱です。

Mooseから信頼できる構造化例外を実際に取得することはできないため、新しい値を設定するときに、イントロスペクションを使用して各型制約を1つずつテストすることを検討してください。場合によっては、これは実行可能なアプローチです。

ところで: Mooseが複合制約を処理する方法には厄介なバグがあることに注意してください。

于 2011-06-16T01:05:18.583 に答える