considerare questo semplice classe:Come posso ottenere eccezioni strutturate da Moose?
package Foo;
use Moose;
has foo => (is => 'rw', isa => 'Int');
E poi questo codice:
use Try::Tiny;
use Foo;
my $f = try {
Foo->new(foo => 'Not an Int');
}
catch {
warn $_;
};
Il codice muore con un bel messaggio di errore grande sul tipo di vincoli fallimento.
mi piacerebbe essere in grado di estrarre ciò che attributo fallito (foo
), ciò che la ragione era (vincolo fallito tipo) e che il valore passato era (Not an Int
) senza dover analizzare una stringa di errore per avere le informazioni.
Qualcosa di simile a questo:
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 $_;
}
};
è possibile? Esiste una distribuzione MooseX in grado di farlo accadere? Meglio ancora, c'è qualche caratteristica di Alce che mi è sfuggita che renderà tutto ciò possibile?
Aggiornamento: Sono particolarmente interessato ai vincoli di tipo, ma altri errori Moose sarebbero molto buoni. Sono anche consapevole del fatto che posso lanciare oggetti con die
. Quindi, strutturare le eccezioni nel codice che scrivo è relativamente facile.
Questo è molto interessante.Funziona come MooseX :: Throwable ma è costruito su Exception :: Class e definisce l'inizio di una gerarchia di classi di eccezioni. Internamente, analizza il messaggio di errore per determinare quale tipo di eccezione da lanciare. – daotoad
Sfortunatamente non è stato aggiornato per un po 'e fallisce praticamente ovunque. –