Conozco las diferencias entre los dos. Una cosa notable es que abort() envía señal SIGABRT, por lo que puede ser relevante cuando su software confía en ellos. Pero para una aplicación típica, exit() parece ser una versión más segura de abort() ...? ¿Hay alguna otra preocupación para usar abort() en lugar de exit()?Cuando abort() es preferible a exit()?
Respuesta
Al usar abort
se volcará el núcleo, si el usuario tiene habilitados los volcados centrales. Así que, como regla general, usaría abort
si no está seguro de lo que salió mal y la única forma de obtener información útil es mediante el análisis de un volcado del núcleo.
Si puede con seguridad exit
desde cualquier punto dado, y no necesita el volcado del núcleo, entonces la salida es un enfoque más agradable.
A veces su programa se rompe en tal medida que su estado se vuelve inconsistente y por lo tanto exit()
no funcionará porque causaría la destrucción de objetos globales y este último no funcionaría correctamente cuando el estado es inconsistente. En tales situaciones, se prefiere abort()
.
Supongo que es por ejemplo cuando IO deja de funcionar debido a una falla de disco duro. Capturas esto como una excepción pero no puedes destruir objetos de archivo porque sus destructores necesitan realizar un cierre de archivo. Gracias por la idea – doc
@doc: Sí, pero es un ejemplo bastante extremo. Un ejemplo más de C++: ya está manejando un error y ocurre otro error (no relacionado con el proceso de manejo de errores) y el código de manejo vuelve a entrar. Eso no es muy bueno: los errores suceden más rápido que usted puede manejarlos. Así que mantienes una bandera "Ya estoy dentro manejando este tipo de error". Una vez que vuelva a ingresar el código, tire la toalla: llame a 'abort()' para finalizar el programa inmediatamente. – sharptooth
Cuál es por qué usted no 'tira' de destructores. Si se llama al destructor durante el desenrollado de la pila causado por una excepción, se llama a 'abort()'. –
Utilice abort()
si su programa está en un estado posiblemente corrupto y considera que es demasiado peligroso tratar de hacer algo más. exit()
provocará que se llamen las funciones atexit
y en los destructores C++ de objetos estáticos. Esto es generalmente lo que quiere para una salida limpia, pero podría ser catastrófico si, por ejemplo, sobrescriben un archivo con datos corruptos.
+1: pero también tienes otras maneras de hacerlo. para no llamar a la función registrada como atexit, también puede _exit() en lugar de exit(), o incluso enviar un SIGKILL a usted mismo para la salida inmediata. – kriss
@Kriss: 'abort()' es la forma estándar de hacerlo, y fácil. ¿Por qué elegirías un método no estándar? – MSalters
@kriss: '_exit()' no es C o C++ estándar, y abortar levantando una señal que no sea 'SIGABRT' parece un poco extraño. –
Se prefiere abortar cuando la aplicación no puede manejar la excepción y no puede entender qué hacer. La aplicación de salida Exit() debe completar todas las tareas correctamente. si se produce una excepción y la aplicación puede manejar el mismo, entonces se produce la llamada a Exit().
- 1. ¿Cuál es la diferencia entre exit() y abort()?
- 2. ¿Mockito es preferible a EasyMock?
- 3. ¿Qué es preferible, a = [] o a = new Array()?
- 4. ¿Qué tipo de herencia es más preferible?
- 5. ¿Es preferible CakePHP para una aplicación web a gran escala?
- 6. ¿Cuándo es preferible una ArrayList a una matriz en Java?
- 7. STA Abort hilo Excepción
- 8. ¿Cuál es más preferible? ¿Guardia o estuche?
- 9. Enum.values () vs EnumSet.allOf(). ¿Cuál es más preferible?
- 10. VB.NET: Abort FormClosing()
- 11. lo cual es preferible: delegado {} o() => {}
- 12. ¿Dónde abort() y termina() "live"?
- 13. script de Bash no salir inmediatamente cuando `exit` se llama
- 14. exit(); morir(); falso retorno;
- 15. Nodejs/mangosta. ¿Qué enfoque es preferible para crear un documento?
- 16. ¿Qué es preferible: gratis o gratis y nulo?
- 17. Thin :: Server # daemonize exit inmediatamente
- 18. Xcode 4.5 Storyboard 'Exit'
- 19. ¿Por qué el lazo de prueba inferior es preferible?
- 20. ¿Cómo cerrar correctamente la aplicación, llame a exit (0)?
- 21. "abort preclean debido a la hora" en Marca simultánea & Barrido
- 22. Frasco: cómo crear código abort() personalizado?
- 23. ¿Es necesario especificar trampas que no sean EXIT?
- 24. ¿Cuándo es preferible AtomicInteger en lugar de sincronizado?
- 25. ¿Por qué es preferible abrir() sobre el archivo() en Python?
- 26. ¿Se ejecutan los destructores al llamar a exit()?
- 27. Mercurial hg Subrepository issue - "abort: revisión desconocida"
- 28. Codeigniter define basepath o exit
- 29. Equivalente a PHP "echo something; exit();" con Python/Django?
- 30. ¿Por qué Mercurial devuelve "Abort: Access is Denied" cuando intenta enviar un repositorio?
que también es un buen punto +1 – doc
Lo expresaría de otra manera: ¿esperas que tus usuarios analicen los volcados del núcleo? Si no, no use abortar. (Teniendo en cuenta que aunque el desarrollador desee un volcado de memoria, puede que sus usuarios no lo hagan. Por lo tanto, tal vez solo deba usarse en una versión de "depuración" de su ejecutable). –
@Ken Simon: Si los usuarios no quieren core vuelcos, pueden apagarlos (ulimit -c 0). Creo que Ubuntu lo hace por defecto. – camh