Рассмотрим этот простой класс:
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
. Итак, структурирование исключений в коде, который я пишу, относительно просто.