2010-07-03 8 views
11

Estoy intentando crear un controlador de excepción simple que me ayudará a depurar la aplicación. En este momento, cuando tengo una excepción, me veo obligado a conectarme con el depurador de Eclipse simplemente para ver los detalles de la excepción.Uso de la gestión de excepciones globales con "setUncaughtExceptionHandler" y "Toast"

Para evitar que he usado setUncaughtExceptionHandler para manejar cualquier excepción no controlada y mostrar un Toast en la excepción. Lamentablemente, eso no funciona.

public class TicTacToe extends Activity { 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     Thread.currentThread().setUncaughtExceptionHandler(new UncaughtExceptionHandler() { 

      @Override 
      public void uncaughtException(Thread thread, Throwable ex) { 
       Toast.makeText(TicTacToe.this, "TOAST", Toast.LENGTH_LONG).show(); 
      } 
     }); 

     setContentView(R.layout.main); 

     Button continueButton = (Button) findViewById(R.id.cell01); 
     continueButton.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 

       int i = 5; 
       i = 5/0; 

       Toast.makeText(TicTacToe.this, "BUTTON", Toast.LENGTH_LONG).show();    
      } 
     }); 

    } 
} 

Esencialmente hice un formulario con un solo botón, al pulsar sobre el cual, sería lanzar una excepción devisiones por cero. Sin embargo, al presionar el botón no se muestra el controlador de brindis global. En cambio, el botón permanece naranja (presionado) y no pasa nada.

hace falta decir que si comento hacia fuera i = 5/0; Veo el brindis que dice que se presionó un botón.

Dos preguntas: 1) ¿Por qué no se muestra la tostada en el cuerpo UncaughtExceptionHandler? ¿Cómo causa que se muestre? 2) ¿Existe una forma alternativa/mejor para el manejo de excepciones globales? Creo que podría instalar aLogCat en el simulador de Android y simplemente registrar la excepción no detectada, pero parece menos cómoda: tendré que cambiar de aplicación solo para ver los detalles de la excepción.

Gracias!

+0

Si coloca Log.e ("TicTacToe", "Excepción no controlada", ex) allí en lugar de Toast, y visualiza el logcat como eclipse o con DDMS, ¿registra el error? –

+1

No necesita depurador, solo la vista de Logcat. Y necesitarás Eclipse para solucionar los problemas de todos modos. – yanchenko

+0

Woah @ Alex. Estaba seguro de que tenía que estar conectado para ver aLogCat. ¡Muchas gracias! – VitalyB

Respuesta

10

No está viendo nada porque la excepción ocurrió en su subproceso de interfaz de usuario y la pila se desenrolló hasta el final. Entonces no hay más Looper y no hay soporte allí que se use para mostrar el Toast. Si desea mostrar la información de excepción en la pantalla, lo más probable es que necesite iniciar otra Actividad en otro proceso.

También hay un problema con su UncaughtExceptionHandler. Debería mantener una referencia al anterior y llamarlo al final de uncaughtException; esto permite que el sistema muestre el botón Forzar cierre.

+0

Gracias, eso lo explica. ¿Significa que se hace este proceso? No puedo evitar que cierre en ese punto? – VitalyB

+0

Sí, casi.El controlador de excepciones no detectadas predeterminado intenta matar el proceso. Estoy pensando que lo hacen por una buena razón y debes llamarlo y dejar que haga eso. – Qberticus

+0

¿Quiere decir que no es posible mostrar el diálogo de alerta en esta actividad? – Gratzi

14

Es posible. Que tiene que hacer dentro de otro hilo
Entonces debería ser así

Thread.currentThread().setUncaughtExceptionHandler(new UncaughtExceptionHandler() { 

     @Override 
     public void uncaughtException(Thread thread, Throwable ex) { 
      new Thread() { 
       @Override 
       public void run() { 
        Looper.prepare(); 
        Toast.makeText(TicTacToe.this, "TOAST", toast.LENGTH_LONG).show(); 
        Looper.loop(); 
       } 
      }.start(); 
     } 
    }); 
+2

se iniciará Otra actividad funcionará con esto ??? Me está mostrando pantalla en negro – sheetal

+0

@sheetal estoy enfrentando el mismo problema. ¿Encontraste una solución para lo mismo? Gracias de antemano – Vishnu

+0

No, no puedes ... Para iniciar otra actividad de este hilo, la actividad debe declararse como un proceso diferente en Manifiesto – sheetal

1

Sé que es una vieja pregunta, pero espero que pueda salvar a alguien de frustración y pérdida de tiempo.

Qberticus es correcto, no se puede iniciar una actividad en el mismo proceso, pero se puede matar el proceso actual y tener ejecutar Android en una nueva:

Intent intent = new Intent(myContext, AnotherActivity.class); 
intent.putExtra("error", errorReport.toString()); 
myContext.startActivity(intent); 

android.os.Process.killProcess(android.os.Process.myPid()); 
System.exit(10); 

se refieren a this page para una impresionante ejemplo de trabajo:

Cuestiones relacionadas