¿Hay un ejemplo de código o un tutorial sobre cómo usar el método Thread.setDefaultUncaughtExceptionHandler? Básicamente, estoy tratando de mostrar un diálogo de alerta personalizado, cada vez que se lanza una excepción, en mi aplicación. ¿Es posible hacer esto? Sé que es un poco complicado mostrar algo en la pantalla, si se lanza la excepción en el hilo de la interfaz de usuario, pero no sé cómo evitarlo.Uso de Global Exception Handling en android
Respuesta
Tenga en cuenta que el The RuntimePermission("setDefaultUncaughtExceptionHandler")
se comprueba antes de configurar el controlador y se asegura de que el proceso se detenga después, lanzando una excepción no detectada, ya que las cosas podrían estar en un estado incierto.
No mostrar nada, de hecho, el subproceso de la interfaz de usuario podría haber sido el que se colgó, escriba un registro y/o envíe los datos a un servidor, en su lugar. Es posible que desee comprobar this question and its answers.
ejemplo básico para alguien que viene a esta página con una solución :)
public class ChildActivity extends BaseActivity {
@SuppressWarnings("unused")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
int a=1/0;
}
}
clase para el manejo de errores:
public class BaseActivity extends Activity{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
@Override
public void uncaughtException(Thread paramThread, Throwable paramThrowable) {
Log.e("Alert","Lets See if it Works !!!");
}
});
}
}
¿No necesita volver a lanzar la excepción para detener la ejecución y no dejar el hilo en un estado indeterminado? – Vaiden
No pude su: D. En uncaughtException puedes dar el manejo que quieras. –
@Vaiden: no es necesario volver a lanzar la excepción. El sistema operativo ya ha terminado el hilo, por lo que no volverá a él una vez que se haya completado su controlador. – HammerNL
He aquí una variante de the answer por Mohit Sharma con las siguientes mejoras:
- No causa la aplicación/servicio para congelarse después de la mano de error ling
- Lets Android haga su manejo de errores normal después de su propio Código
:
public class BaseActivity extends Activity {
@Override
public void onCreate() {
super.onCreate();
final Thread.UncaughtExceptionHandler oldHandler =
Thread.getDefaultUncaughtExceptionHandler();
Thread.setDefaultUncaughtExceptionHandler(
new Thread.UncaughtExceptionHandler() {
@Override
public void uncaughtException(
Thread paramThread,
Throwable paramThrowable
) {
//Do your own error handling here
if (oldHandler != null)
oldHandler.uncaughtException(
paramThread,
paramThrowable
); //Delegates to Android's error handling
else
System.exit(2); //Prevents the service/app from freezing
}
});
}
}
Disculpe la última pregunta, pero ¿hay algún motivo por el que use el código de salida 2 en su llamada 'System.exit()'? ¿A Android le importa el código de salida? Parece que no puedo encontrar información sobre esto ... –
@MarkusA. No recuerdo por qué usé ese código. Tal vez '0' y' 1' hicieron que la aplicación se congelara o algo así. – Sam
Hmmm ... Supongo que podría valer la pena una pregunta por separado: http://stackoverflow.com/questions/30226842/does-android-care-about-exit-status-code-passed-to-system-exit Veamos lo que viene de eso ... –
- 1. Monotouch Global Exception handling
- 2. WinForms Global Exception Handling?
- 3. UpdatePanel Exception Handling
- 4. MVVM Exception Handling
- 5. WCF Exception Handling
- 6. C++ Exception Handling
- 7. LINQ Iterator Exception Handling
- 8. PostgreSQL Exception Handling
- 9. TPL y Exception Handling
- 10. MSTest Test Context Exception Handling
- 11. Haskell. Non IO Exception handling
- 12. ASP.NET MVC Global error handling
- 13. Outlook 2007 Add-in Exception Handling
- 14. MVC Global error handling: Application_Error no dispara
- 15. Uso de la clase Exception en C#
- 16. Cómo manejar las excepciones SIGKILL, SIGABRT, Signal-0 mediante Exception Handling en la programación de iPhone
- 17. Global Search En Android
- 18. SystemStackError en Ruby Exception Handling using Aquarium (Programación Orientada a Aspectos)
- 19. Android Custom Widget Inflate Exception
- 20. "Break On Exception" en Eclipse/Android
- 21. uso hgignore Global
- 22. PHP DOMDocument error handling
- 23. Android Socket Exception "socket está cerrado"
- 24. Spring @Resource Handling
- 25. Perl Handling Directorio Separadores
- 26. Uso de eval() con un global personalizado
- 27. WCF and MSMQ failure handling
- 28. catch null exception
- 29. MVC Area Error Handling
- 30. Best practice Error handling
puedo preguntar cuál es el punto? El diálogo estándar de Android permite a los usuarios informar el bloqueo, que enviará un seguimiento de la pila a su cuenta. Si realmente quieres hacerlo, bueno, solo comienza un nuevo intento con Theme.Dialog, pasa la información de excepción en los extras y estás listo. – EboMike
En mi aplicación estoy usando un archivo de base de datos. Si la aplicación no se conecta a la base de datos, se lanzará una excepción. Quiero ver esta excepción y mostrar un mensaje personalizado. Esto es solo un ejemplo. Hay más situaciones como esta. Así que sería mejor para mí detectar todas estas excepciones en su lugar. – Gratzi
Eso no parece una buena idea. La falla de conectarse a una base de datos es un problema específico con una excepción específica. Está manejando cualquier posible excepción, incluida una NullPointerException debido a un código descuidado. Recomendaría * encarecidamente * poner bloques try/catch alrededor del código de su base de datos que * solo * atrape las excepciones específicas de la base de datos. – EboMike