2010-10-23 24 views
22

Me he dado cuenta de que Exception.pm y Error.pm no parecen ser ampliamente utilizados en la comunidad de Perl. ¿Eso se debe a la gran huella de eval para el manejo de excepciones?¿Cuál es la mejor manera de manejar excepciones en Perl?

También los programas Perl parecen tener una política mucho más indulgente con respecto al manejo de excepciones en general. ¿Hay alguna razón convincente para esto?

En cualquier caso, ¿cuál sería el mejor método para el manejo de excepciones en Perl?

+2

dupe de http://stackoverflow.com/questions/503189/is-object-oriented-exception-handling-in-perl-worth-it http://stackoverflow.com/questions/2165161/whats- broken-about-exceptions-in-perl http://stackoverflow.com/questions/2439966/do-you-use-an-exception-class-in-your-perl-programs-why-or-why-not http://stackoverflow.com/questions/1426501/how-do-i-handle-exceptions-in-a-procedural-language - ¿realmente necesitamos otra publicación sobre el manejo de excepciones de Perl? – Ether

+1

Consulte mi respuesta en [¿Sigue siendo recomendable :: Tiny para el manejo de excepciones en Perl 5.14 o posterior?] (Http://stackoverflow.com/a/10374265/2766176) –

Respuesta

43

El consenso de la comunidad de Perl parece ser que Try::Tiny es la forma preferida de hacer un manejo de excepciones. La "política indulgente" que se refieren a es probablemente debido a una combinación de:

  • Perl no ser un lenguaje totalmente orientado a objetos. (Por ejemplo, en contraste con Java donde no puede evitar el tratamiento de excepciones.)
  • El trasfondo de muchos desarrolladores de Perl. (Los lenguajes como C y shell no tienen mecanismos de excepción ).
  • El tipo de tareas para las que la gente suele usar Perl. (Scripts pequeños para munging de texto y generación de informes donde no es necesario el manejo de excepciones.)
  • Perl que no tiene un mecanismo de excepción (bueno) incorporado.

Tenga en cuenta que el último punto significa que usted va a ver un montón de código como este:

eval { something() }; 
if ([email protected]) { 
    warn "Oh no! [[email protected]]\n"; 
} 

Ese es el manejo a pesar de que no utiliza try/sintaxis captura excepción. Sin embargo, es frágil y se dividirá en varios casos sutiles en los que la mayoría de la gente no piensa. Try :: Tiny y los otros módulos de manejo de excepciones en CPAN se escribieron para que sea más fácil hacerlo bien.

1. C tiene setjmp() y longjmp(), que puede ser utilizado para una forma muy cruda de manejo de excepciones.

+2

+1 "hazlo * más fácil * para obtener la información correcta " –

+15

Y solo para aclarar un error común que el cartel original puede o no sufrir:' eval BLOCK' es * not * 'eval STRING' y no compila el código en tiempo de ejecución. Es solo un método de manejo de excepciones, 'try' con un nombre gracioso y una semántica ligeramente divertida. – hobbs

Cuestiones relacionadas