2011-10-28 14 views
7

Estoy tratando de pasar una excepción a una actividad destinada a volcar la información relevante en la pantalla.Pase una excepción como un paquete

Actualmente lo paso a través de un paquete:

try { 
    this.listPackageActivities(); 
} catch (Exception e) { 
    Intent intent = new Intent().setClass(this, ExceptionActivity.class).putExtra("Exception", e); 
    startActivity(intent); 
} 

Pero cuando se llega allí:

if (!(this.bundle.getParcelable("Exception") != null)) 
    throw new IndexOutOfBoundsException("Index \"Exception\" does not exist in the parcel." + "/n" 
    + "Keys: " + this.bundle.keySet().toString()); 

es lanzada Este dulce excepción pero cuando miro el conjunto de claves y detalles del paquete que dice que hay un objeto parcelable con una clave llamada "Excepción".

Entiendo que esto tiene algo que ver con los tipos, pero no entiendo lo que estoy haciendo mal. Solo quiero descargar información sobre una excepción, cualquier excepción a la pantalla. ¿Hay alguna manera de hacerlo sin tener que condensar toda la información en una cadena cada vez?

Respuesta

14

me encontré con esta pregunta cuando yo estaba buscando un método para transferir excepciones de un servicio a una actividad. Sin embargo, encontré un método mejor, puede usar el método putSerializable() de la clase Bundle.

Para añadir:

Throwable exception = new RuntimeException("Exception"); 
Bundle extras = new Bundle(); 
extras.putSerializable("exception", (Serializable) exception); 

Intent intent = new Intent(); 
intent.putExtras(extras); 

Para recuperar:

Bundle extras = intent.getExtras(); 
Throwable exception = (Throwable) extras.getSerializable("exception"); 
String message = exception.getMessage(); 
2

La clase Exception no implementa la interfaz Parcelable. A menos que Android esté rompiendo algunas construcciones fundamentales de Java de las que no estoy enterado, esto significa que no puede poner una Excepción como una Parcela en un Paquete.

Si desea "pasar" la publicación a una nueva actividad, solo agregue los aspectos de la misma que va a necesitar en su nueva actividad. Por ejemplo, supongamos que solo desea pasar el mensaje de excepción y la pila de seguimiento. Más le así que algo como esto:

Intent intent = new Intent().setClass(this,ExceptionActivity.class) 
intent.putExtra("exception message", e.getMessage()); 
intent.putExtra("exception stacktrace", getStackTraceArray(e)); 
startActivity(intent); 

donde getStackTraceArray se ve así:

private static String[] getStackTraceArray(Exception e){ 
    StackTraceElement[] stackTraceElements = e.getStackTrace(); 
    String[] stackTracelines = new String[stackTraceElements.length]; 
    int i =0; 
    for(StackTraceElement se : stackTraceElements){ 
    stackTraceLines[i++] = se.toString(); 
    } 
    return stackTraceLines; 
} 
+0

Jaja, no debería haber asumido. ¿Hay una mejor manera de pasar la información a la actividad? –

+0

make one: public class ParcelableException extends Exception implements Parcelable {...} – yorkw

+0

He actualizado mi respuesta para solucionar este problema. –

Cuestiones relacionadas