2012-01-29 29 views
6

En mi clase de aplicación, intento capturar una fuerza antes de que suceda, para poder registrarla y luego volver a lanzarla para que el android pueda manejarla. Lo hago ya que algunos usuarios no informan que se cierra la fuerza.Retiro UncaughtExceptionHandler Excepción después de iniciar sesión

Estoy desarrollando en eclipse, y eclipse no me permite volver a lanzar la excepción. Muestra un error que dice "Tipo de excepción no controlada Throwable: Surround with try/catch". ¿Cómo puedo volver a lanzar la excepción?

public class MainApplication extends Application 
{ 
    @Override 
    public void onCreate() 
    { 
    super.onCreate(); 

    try 
    { 
     //Log exception before app force closes 
     Thread.currentThread().setUncaughtExceptionHandler(new UncaughtExceptionHandler() { 
      @Override 
      public void uncaughtException(Thread thread, Throwable ex) { 
       AnalyticsUtils.getInstance(MainApplication.this).trackEvent(
         "Errors",      // Category 
         "MainActivity",     // Action 
         "Force Close: "+ex.toString(), // Label 
         0);        // Value 
       AnalyticsUtils.getInstance(MainApplication.this).dispatch(); 

       Toast.makeText(MainApplication.this, "Snap! Something broke. Please report the Force Close so I can fix it.", Toast.LENGTH_LONG); 

       //rethrow the Exception so user can report it 
       //throw ex; //<-- **eclipse is showing an error to surround with try/catch** 
      } 
     }); 

    } catch (Exception e) 
    { 
     e.printStackTrace(); 
    } 
} 

}

Respuesta

12

Disculpas, no un experto Android - Pero parece que no se puede tirar porque su ex firma del método "vacío uncaughtException (Tema, Throwable)" no declarar que "lanza" cualquier cosa.

Suponiendo que está anulando una interfaz de API y (a) no puede modificar esta firma y (b) no quiere porque la estaría volviendo fuera de contexto, ¿podría utilizar un patrón de decorador y básicamente subclase la implementación predeterminada UncaughtExceptionHandler para registrar su mensaje y luego dejar que continúe el proceso como de costumbre?

Editar: no probado, pero esto podría parecer un poco como:

final UncaughtExceptionHandler subclass = Thread.currentThread().getUncaughtExceptionHandler(); 
    Thread.currentThread().setUncaughtExceptionHandler(new UncaughtExceptionHandler() { 
     @Override 
     public void uncaughtException(Thread thread, Throwable ex) { 
      // your code 
      AnalyticsUtils.getInstance(MainApplication.this).trackEvent(
        "Errors",      // Category 
        "MainActivity",     // Action 
        "Force Close: "+ex.toString(), // Label 
        0);        // Value 
      AnalyticsUtils.getInstance(MainApplication.this).dispatch(); 
      Toast.makeText(MainApplication.this, "Snap! Something broke. Please report the Force Close so I can fix it.", Toast.LENGTH_LONG).show(); 

      // carry on with prior flow 
      subclass.uncaughtException(thread, ex); 
     } 
    }); 
+0

Hmm Creo que tienes razón. No estoy familiarizado con el patrón decorador, ¿podría mostrar algún código para mostrarme cómo puedo hacer esto? –

+0

¡Sí, eso funcionó! Gracias Capn Sparrow. (Nota: La tostada no se muestra). –

+0

Momento tarde aquí, pero como acabo de utilizar la solución de Capn Sparrow, debo señalar que la tostada no se muestra porque ahora hay .show() al final de la llamada a makeText. Esto me pone tan a menudo. – AJ87uk

0

No estoy muy seguro de si esto es lo que quiere, sin embargo se puede añadir una cláusula finally que se ejecutará después de que cualquiera de una exitosa try o una manejado catch:

try { 
    //your code 
} catch (Exception e) { 
    //print stack trace 
} finally { 
    //Log 
} 
+0

No es exactamente lo que estoy buscando, ya que me gustaría un "atrapar todo" que registrará cualquier excepción antes de que fuerce el cierre de mi aplicación. Utilizo try/catch pero solo en caso de que algo quede sin detectar. –

0

creo siguiente código debería funcionar. La ejecución del código del controlador utilizando un nuevo subproceso permite que la aplicación muestre alertas/brindis y realice otras operaciones.

Además, puede intentar invocando System.exit(0) justo antes de salir de run(). Esto relanza la última actividad.

que comprueba esto en tanto jengibre Pan, así como Jelly Bean.

final UncaughtExceptionHandler subclass = Thread.currentThread().getUncaughtExceptionHandler(); 
    Thread.currentThread().setUncaughtExceptionHandler(new UncaughtExceptionHandler() { 
     @Override 
     public void uncaughtException(Thread thread, Throwable ex) { 
      new Thread() { 
       @Override 
       public void run() { 
        Looper.prepare(); 
        // your code 
        AnalyticsUtils.getInstance(MainApplication.this).trackEvent(
          "Errors",      // Category 
          "MainActivity",     // Action 
          "Force Close: "+ex.toString(), // Label 
          0);        // Value 
        AnalyticsUtils.getInstance(MainApplication.this).dispatch(); 
        Toast.makeText(MainApplication.this, "Snap! Something broke. Please report the Force Close so I can fix it.", Toast.LENGTH_LONG); 

        Looper.loop(); 
       } 
      }.start(); 
     } 
    }); 
Cuestiones relacionadas