ruby - provocado - ¿Cuál es la diferencia entre salir y abortar?
diferencia entre legalización y despenalización del aborto (1)
"¡ Salga, salga! ¡Anule, levante ... ¡Sáquenme de aquí! " Describe todo lo que querría saber, creo.
En breve:
-
Kernel.exit(code)
"sale" de la secuencia de comandos de inmediato y devuelve elcode
al sistema operativo. Sin embargo, justo antes de hacerlo, llama a cualquier controladorat_exit
registrado que su código podría haber registrado. -
Kernel.exit!(code)
hace lo mismo, pero sale inmediatamente, no se llamaat_exit
handlers. -
Kernel.abort(message)
toma unmessage
que se imprimirá en STDERR justo antes de salir con un código de falla = 1.
Los diferentes valores de los códigos de salida son apenas adecuados para detectar problemas y depurar el código. Sin embargo, son muy fáciles de usar y hacer que el proceso padre los lea es casi trivial. Por lo tanto, exit
y exit!
.
Si puede pasar más tiempo y hacer que la comprobación de errores sea más robusta, necesitará algunos mensajes de error graves, no solo códigos. Tradicionalmente, puede imprimirlos a STDERR si existe. Puede imprimir manualmente a STDERR a través de las entradas normales, pero los códigos de salida se seguirán utilizando en el nivel más bajo.
Imprimir en STDERR no marca su trabajo automáticamente como fallido, por lo tanto, la abort
se creó para permitirle escribir y salir fácilmente. Un código de salida predeterminado de 1 es suficiente para marcar la condición de FALLA, ya que se asume que toda la información contextual real se incluirá en los mensajes de error proporcionados por usted.
También tenga en cuenta que cualquier excepción no manejada, como raise "wtf"
sin rescue
cualquier lugar, se comporta como si llamara a Kernel.abort
: se imprimen en STDERR y usan exitcode=1
.
Dijiste exit(false)
pero la Kernel.exit!(code) La documentación dice que el parámetro es el status code
que se utilizará.
Acabo de comprobarlo en Windows y Ruby 1.9.3:
exit 0 # quits with code: 0
exit 1 # quits with code: 1
exit false # quits with code: 1
exit true # quits with code: 0
lo que realmente me sorprende, ya que asumo que false
sería forzado a 0
en la forma tradicional de C. Entonces, tal vez deberías estar usando números enteros como 0
o 1
para tener perfectamente claro qué código se usará.
La documentación de abort
dice que abort
Finalice la ejecución inmediatamente, de forma efectiva llamando a Kernel.exit (falso).
¿Qué significa exactamente "inmediatamente"? ¿Cuál es la diferencia entre abort
y exit
con estado no true
?