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