Pregunta

¿Cómo puedo comprobar qué tipo de excepción causó el guión o bloque eval de interrumpir? Necesito saber el tipo de error, y donde se produjo la excepción.

¿Fue útil?

Solución

La forma en que Perl

idiomático Perl es que estamos ignorando o bien todos los errores o la captura de ellos para el registro o reenviar a otra parte:

eval { func() };  # ignore error

o

eval { func() };
if ($@) {
    carp "Inner function failed: $@";
    do_something_with($@);
}

o (usando Trate :: Tiny - ver que la página de razones por las que es posible que desee para usarlo sobre Perl incorporado en el manejo de excepciones):

try { func() }
catch {
     carp "Inner function failed: $_";
     do_something_with($_);
};

Si desea comprobar el tipo de excepción, el uso de expresiones regulares:

if ( $@ =~ /open file "(.*?)" for reading:/ ) {
    # ...
}

La línea y el archivo es también en esa cadena también.

Esto es sin embargo bastante desagradable, porque usted tiene que saber la cadena exacta. Si realmente quieres un buen manejo de errores, utilizar un módulo excepción de CPAN .

Excepción :: Clase

$ @ no tiene que ser una cadena, que puede ser un objeto. Excepción :: Clase le permite declarar y excepción lanzar objetos de Java-estilo. Puede pasar información arbitraria (nombre de archivo, etc.) con el error cuando lo tiras y obtener esa información usando métodos de objeto en lugar de análisis de expresiones regulares - incluyendo el archivo y número de línea de la excepción.

Si está utilizando un módulo de terceros que no utilice error :: Excepción, considere

$SIG{__DIE__} = sub { Exception::Class::Base->throw( error => join '', @_ ); };

Esto transformará en todos los errores Excepción :: objetos de clase.

error :: conjuntos de excepción hasta stringification adecuada para Excepción :: objetos de clase.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top