2012-04-26 7 views
23

He encontrado que existe el módulo Error que proporciona funcionalidad try and catch como en java. Pero estoy confundido sobre cómo puede imprimir la excepción que devuelve.¿Cómo usar correctamente la captura de prueba en Perl que proporciona error.pm?

me gustaría entender cómo hacer la siguiente

try { 
    // do something that will fail! 

} catch (Error e) { 
    // Print out the exception that occurred 
    System.out.println(e.getMessage()); 
} 

¿Cómo consigo la impresión del error con el seguimiento de la pila?

Respuesta

40

Probablemente sea mejor que use Try::Tiny que le ayudará a evitar un número de pitfalls with older perls.

use Try::Tiny; 

try { 
     die "foo"; 
} catch { 
     warn "caught error: $_"; 
}; 
+0

¿Cómo puedo descargar esta advertencia en los registros? – pitchblack408

+0

¿Puedo crear excepciones? – pitchblack408

+1

No estoy seguro de lo que está preguntando. Puede volcar cosas en los archivos de registro al iniciar sesión y crea excepciones con 'die' o' croak'. ¿Estás preguntando cómo armar objetos de excepción, etc.? Esa sería una pregunta separada. –

36

Última revisión, Error ha quedado obsoleto. Pero existen algunas cosas que lo haría sin ese módulo:

eval { 
    die "Oops!"; 
    1; 
} or do { 
    my $e = [email protected]; 
    print("Something went wrong: $e\n"); 
}; 

Básicamente, utilice eval en lugar de try, die en lugar de throw, y buscar la excepción en [email protected]. El valor verdadero al final del bloque eval es parte de una expresión idiomática para evitar que [email protected] cambie involuntariamente antes de volver a usarse en versiones Perl anteriores a 5.14, consulte P::C::P::ErrorHandling::RequireCheckingReturnValueOfEval para obtener más información. Por ejemplo, este código adolece de este defecto.

# BAD, DO NOT USE WITH PERLS OLDER THAN 5.14 
eval { 
    die "Oops!"; 
}; 
if (my $e = [email protected]) { 
    print("Something went wrong: $e\n"); 
} 
# BAD, DO NOT USE WITH PERLS OLDER THAN 5.14 

Pero tenga en cuenta que muchas de las operaciones de Perl no generan excepciones cuando fallan; simplemente devuelven un código de error. Este comportamiento se puede modificar mediante autodie para módulos internos y módulos estándar. Si está utilizando autodie, entonces la forma estándar de hacer try/catch es esto (directamente de la perldoc autodie):

use feature qw(switch); 

eval { 
    use autodie; 

    open(my $fh, '<', $some_file); 

    my @records = <$fh>; 

    # Do things with @records... 

    close($fh); 

}; 

given ([email protected]) { 
    when (undef) { say "No error";     } 
    when ('open') { say "Error from open";    } 
    when (':io') { say "Non-open, IO error.";   } 
    when (':all') { say "All other autodie errors." } 
    default  { say "Not an autodie error at all." } 
} 

Para conseguir un StackTrace, mira a Carp.

+0

Consulte [la sección ANTECEDENTES en 'Try :: Tiny' docs] (http://search.cpan.org/perldoc/Try::Tiny#BACKGROUND) para conocer los problemas que puede encontrar con' perl's antiguos cuando usando 'eval' para el manejo de excepciones. –

+0

[El manejo de excepciones se corrigió en 5.14.0] (http://search.cpan.org/perldoc/perl5140delta#Exception_Handling) –

+0

Soy nuevo en Perl, ¿cómo averiguo qué está en desuso? No quiero usar eval {porque no se siente natural. Vengo de un fondo java/C++/C#. Entonces, ¿si cambio a Try :: Tiny que es más nuevo y más estable? – pitchblack408

5

Si quieres algo un poco más potente que Trate :: Tiny, es posible que desee intente buscar en el módulo TryCatch en CPAN.

Cuestiones relacionadas