Digamos que mi aplicación hace algo irrecuperable (esto nunca sucede, ¿no ?: P). ¿Debo usar exit()? ¿Debo usar NSAssert (false, @ "Foo")? ¿Debo arrojar algo de alguna manera? Respuesta difícil a google para.¿Cuál es la mejor manera de salir y manejar un error fatal en Objective-C?
Respuesta
No creo que deba forzar el cierre de su aplicación si ocurre algo malo, ya que es molesto para el usuario; no tendrán ni idea de lo que salió mal. Además, es probable que Apple rechace tu aplicación si esto es lo suficientemente común.
En su lugar, debe abrir un cuadro de diálogo para decir qué fue mal (por ejemplo, escribir un error en la base de datos, intente de nuevo).
Si su aplicación puede terminar en un estado en que está totalmente rota, debe volver a diseñar su aplicación. ¿Podría dar un ejemplo de algo "irrecuperable"?
Quizás esta sea una pregunta incorrecta, y es por eso que no encuentro una respuesta. Primero, esta no es una aplicación ios. Y estoy apareciendo un diálogo. El problema en el que estoy trabajando actualmente es un error desconocido en el sistema de archivos. Pero actualmente estoy preocupado de que el estado de la aplicación no sea funcional después de que esto ocurra, por lo que me gustaría salir. ¿Supongo que podría crear un método "rápido para dejar de fumar" que simplemente salga de la aplicación normalmente? Dado que esto no ocurriría (con suerte) con una versión de lanzamiento del proyecto, supongo que quería sacar la aplicación de su miseria. –
Si no es una aplicación de iOS, entonces creo que la experiencia de usuario de tener una "Esta aplicación encontró un error y debe salir" es más aceptable. Aun así, solo debe usar esto como último recurso: intente manejar el error con elegancia. – pheelicks
Reflexionando sobre esto, creo que realmente no estaba haciendo una buena pregunta. Gracias por tu ayuda. Eso es más o menos lo que estoy haciendo en este momento, pero la esperanza es que el usuario nunca verá este código. –
Si su aplicación hace algo realmente irrecuperable, es probable que se termine por el O.S. sin que tengas la posibilidad de saberlo. Piensa en acceder a un objeto desasignado.
Si está considerando errores o condiciones imprevistas que su programa podría detectar, entonces depende en gran medida de qué se trata. Pero una política general es:
informando al usuario sobre el hecho de que ocurrió un error;
tratando de recuperar tanto como sea posible;
salen de la aplicación con gracia.
1 y 3 descartar explícitamente ambos NSAssert
y exit()
opciones que mencionas. Tirar tampoco ayuda, porque si lanzas una excepción y no la manejas, tu programa terminará abruptamente.
Salir correctamente significa salir como en un caso normal, cuando se invocan todos los métodos dealloc, se cierran todos los archivos, se liberan todos los recursos. Y posiblemente almacene suficiente información sobre el estado de ejecución del programa para que sea posible recuperarlo en el siguiente inicio.
- 1. ¿Cuál es la mejor manera de manejar objects.get de Django?
- 2. ¿Cuál es la mejor manera de manejar excepciones en Perl?
- 3. ¿Cuál es la mejor manera de manejar FBO en OpenGL?
- 4. ¿Cuál es la mejor manera de manejar múltiples acciones?
- 5. La mejor manera de manejar los mensajes de error
- 6. ¿cuál es la diferencia entre salir y salir? en ruby?
- 7. ¿Cuál es la mejor manera de manejar ramas de sucursales de proveedores en SVN?
- 8. ¿Cuál es la mejor manera de manejar buffers grandes en una pila de protocolos en capas?
- 9. ¿Cuál es la mejor práctica para manejar contraseñas en github?
- 10. ¿Una mejor manera de manejar la bifurcación y la fusión?
- 11. ¿Cuál es la mejor manera de manejar I18N en tablas de búsqueda?
- 12. La mejor manera de manejar una KeyNotFoundException
- 13. ¿La mejor manera de manejar múltiples UITableViews en un UIViewController?
- 14. ¿Cuál es la mejor manera de manejar múltiples eventos clave en Javascript?
- 15. ¿Cuál es la mejor manera de manejar las diferencias paisaje/retrato en IB?
- 16. ¿Cuál es la mejor manera de implementar protocolos?
- 17. ¿Cuál es la mejor manera de escribir un archivo grande en un disco en PHP?
- 18. ¿Cuál es la mejor manera de barajar un NSMutableArray?
- 19. ¿Cuál es la mejor manera de probar un procedimiento almacenado?
- 20. ¿Cuál es la mejor manera de inicializar un frijol?
- 21. ¿Cuál es la mejor manera de manejar entradas de dirección que pueden ser de varios países?
- 22. ¿Cuál es la mejor manera de implementar params en JavaScript?
- 23. ¿Cuál es la mejor manera de manejar múltiples tipos de permisos?
- 24. ¿Cuál es la mejor manera de implementar un "temporizador"?
- 25. ¿Cuál es la mejor manera de manejar imágenes de muy alta resolución?
- 26. ¿Cuál es la mejor manera de determinar un bucle invariante?
- 27. ¿Cuál es la mejor manera de probar un RedirectToAction?
- 28. ¿Cuál es la mejor manera de vaciar un directorio?
- 29. ¿Cuál es la mejor manera de dibujar en la consola?
- 30. ¿Cuál es la mejor manera de liberar memoria después de regresar de un error?
La solución estándar es ejecutar Pong o Rogue en otra ventana en el lado opuesto de la pantalla para distraerlos mientras reinicia silenciosamente la aplicación. Al menos, de seguro desearía que Xcode hiciera esto en lugar de presentar un "Hey, ¿te gustaría que me cuelgue ahora? ¿Cómo estás ahora?" diálogo. –