如何从Moose获得结构化异常?

dao*_*oad 12 perl moose

考虑这个简单的类:

package Foo;
use Moose;
has foo => ( is => 'rw', isa => 'Int' );
Run Code Online (Sandbox Code Playgroud)

然后这段代码:

use Try::Tiny;
use Foo;
my $f = try {
    Foo->new( foo => 'Not an Int' );
}
catch {
    warn $_;
};
Run Code Online (Sandbox Code Playgroud)

代码消失了一个关于类型约束失败的很好的大错误消息.

我希望能够提取失败的属性(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 $_;
    }
};
Run Code Online (Sandbox Code Playgroud)

这可能吗?是否有可以实现这一目标的MooseX发行版?更好的是,是否有一些我错过的Moose功能可以实现这一目标?

更新:我对类型约束特别感兴趣,但其他Moose错误也非常好.我也知道我可以抛出物体die.因此,在我编写的代码中构造异常相对容易.

cjm*_*cjm 4

我自己没有尝试过,但我认为MooseX::Error::Exception::Class可能就是您正在寻找的。