2011-10-28 16 views
7

Próbuję przekazać wyjątek do działania, które ma na celu zrzucenie odpowiednich informacji na ekran.Przepuszczanie wyjątku jako paczki

Obecnie mijam go przez wiązkę:

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

Ale kiedy robi się tam:

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

Ten słodki jest wyjątek, ale kiedy patrzę na Keyset i szczegóły wiązka mówi mnie, że istnieje jeden obiekt do rozłożenia z kluczem o nazwie "Wyjątek".

Rozumiem, że ma to coś wspólnego z typami, ale nie rozumiem, co robię źle. Chcę tylko zrzucić informacje o wyjątku, jakimkolwiek wyjątku na ekranie. Czy istnieje sposób, aby to zrobić bez konieczności skumulowania wszystkich informacji w ciągu za każdym razem?

Odpowiedz

14

Natknąłem się na to pytanie, kiedy szukasz sposobu przekazywania wyjątków z usługi do aktywności. Jednak znalazłem lepszą metodę, można użyć metody putSerializable() klasy Bundle.

Aby dodać:

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

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

Aby pobrać:

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

Wyjątek klasy nie implementuje interfejsu Parcelable. O ile Android nie złamie podstawowych konstrukcji Javy, o których nie wiem, oznacza to, że nie można umieścić wyjątku jako paczki w pakiecie.

Jeśli chcesz "przekazać" wykonanie do nowej aktywności, po prostu spakuj jej aspekty, które będą potrzebne w nowej aktywności. Na przykład, powiedzmy, że chcesz przekazać wiadomość wyjątku i stacktrace. Można by więc coś takiego:

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

gdzie getStackTraceArray wygląda następująco:

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

Haha, nie powinienem założyć. Czy istnieje lepszy sposób przekazania informacji do działania? –

+0

make one: public class ParcelableException extends Implementuje wyjątki Parcelable {...} – yorkw

+0

Zaktualizowałam moją odpowiedź na ten adres. –

Powiązane problemy