2010-08-30 31 views
28

Estoy usando la comprobación de sintaxis para ver si mi script de Perl se está utilizando de la manera correcta. Si la sintaxis no es correcta, visualizo un mensaje que dice cuál es la sintaxis correcta y luego finalizo la ejecución del programa.Cómo finalizar un programa en Perl: ¿salir o morir?

entre:

print "Please use the following syntax: ..."; 
exit 1; 

y:

die("Please use the following syntax: ..."); 

¿Cuál debo usar? Sé que die habría sido la respuesta si el manejo de excepciones estuviera en su lugar, pero ese no es el caso.

¿Cuál es la mejor opción para la terminación del programa sin manejo de excepción? Por favor, también diga por qué.

+5

Vale la pena señalar que 'die' agrega automáticamente el nombre de archivo y el número de línea * a menos que * la cadena de error termine con una nueva línea' "\ n" '. –

Respuesta

34

Depende de lo que quiera que suceda con STDERR y STDOUT. Prefiero enviar mensajes de tipo error y advertencia a STDERR para que cuando alguien intente redirigir la salida a un archivo, siga viendo los mensajes de error; Sin embargo, hay momentos cuando STDOUT se usa para comunicar el estado al usuario para que pueda tail -f o paginarlo, y en esos momentos escribir en STDERR les causa dolor (tienen que redirigir STDERR de vuelta a STDOUT con 2>&1, y no todos saben cómo hacer eso). Entonces, qué utilizar, die o print y exit, depende en gran medida del tipo de programa que está escribiendo.

Hay otras ventajas/desventajas de utilizar die:

  • Puede interceptar die con un eval, pero no salir
  • Puede ejecutar código cuando el programa llama die mediante la instalación de un manejador de señales para la __DIE__ señal
  • puede reemplazar fácilmente la función die

Cada uno de ellos tiene momentos en los que es útil poder hacerlos, y momentos en que es un dolor que se puedan hacer.

+0

¿Qué pasa si 'adviertes' el mensaje de error y luego utilizas' exit'? ¿Considerarías eso obtener lo mejor de ambos? – Arc676

+1

@ Arc676 Dado que 'warn' también escribe a STDERR, no veo cómo podría ser mejor que' print' y 'exit' en el escenario que describí. Es importante recordar que no hay "lo mejor"; solo hay comportamientos que pueden ser beneficiosos/dañinos en ciertas circunstancias. En general, la respuesta correcta es 'morir', ya que permite la mayor flexibilidad en el programa, pero debe tener en cuenta cómo el usuario del programa consumirá la salida. –

21

print impresiones a STDOUT pero die impresiones a STDERR

exit 1 termina con un estado de salida de 1 pero die salidas con salida valor actual de errno que es $!

Por lo tanto die es la manera preferida como su más simple y corta.

+5

o '$? >> 8' si '$!' Es '0'. o 255 si '$? >> 8' es 0. –

+0

@Chas: ¿Qué son '$!', '$?'? – Lazer

+1

[$ OS_ERROR] (http://p3rl.org/var#%24OS_ERROR), [$ CHILD_ERROR] (http://p3rl.org/var#%24CHILD_ERROR) – daxim

Cuestiones relacionadas