considerar esta clase simple:¿Cómo puedo obtener excepciones estructuradas de Moose?
package Foo;
use Moose;
has foo => (is => 'rw', isa => 'Int');
Y entonces este código:
use Try::Tiny;
use Foo;
my $f = try {
Foo->new(foo => 'Not an Int');
}
catch {
warn $_;
};
El código muere con un mensaje de error grande y bonita sobre restricciones de tipo defecto.
Quisiera poder extraer qué atributo falló (foo
), cuál fue la razón (restricción de tipo fallida) y cuál fue el valor pasado (Not an Int
) sin tener que analizar una cadena de error para obtener la información.
Algo como esto:
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 $_;
}
};
Es esto posible? ¿Hay una distribución de MooseX que pueda hacer que esto suceda? Mejor aún, ¿hay alguna característica de Moose que eché de menos que hará esto posible?
Actualización: Estoy particularmente interesado en las limitaciones de tipo, pero otros errores de Moose también serían muy buenos. También soy consciente de que puedo lanzar objetos con die
. Entonces, estructurar excepciones en el código que escribo es relativamente fácil.
Esto es muy interesante.Funciona como MooseX :: Throwable pero se basa en Exception :: Class y define los inicios de una jerarquía de clases de excepción. Internamente, analiza el mensaje de error para determinar qué tipo de excepción arrojar. – daotoad
Desafortunadamente no se ha actualizado por un tiempo, y falla sus pruebas prácticamente en todas partes. –