2010-12-13 27 views
41

¿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

+0

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

+0

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

+0

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

Respuesta

4

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.

61

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 !!!"); 
      } 
     }); 
    } 
} 
+1

¿No necesita volver a lanzar la excepción para detener la ejecución y no dejar el hilo en un estado indeterminado? – Vaiden

+0

No pude su: D. En uncaughtException puedes dar el manejo que quieras. –

+0

@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

22

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 
       } 
      }); 
    } 
} 
+1

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 ... –

+0

@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

+0

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 ... –