2011-10-28 49 views
7

我正在嘗試將異常傳遞給意圖將相關信息轉儲到屏幕的活動。作爲包裹傳遞例外

目前我之通過捆綁:

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

但是,當它到達那裏:

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

這甜蜜的異常被拋出,但是當我看到密鑰集和包詳細信息,它告訴我有一個名爲「Exception」的鍵的可分區對象。

我明白,這與類型有關,但我不明白我做錯了什麼。我只想轉儲關於異常的信息,屏幕上的任何異常。有沒有辦法做到這一點,而不必每次都將所有信息壓縮成字符串?

回答

14

我無意中發現這個問題時,我正在尋找一種方法來從服務傳遞例外的活動。不過,我找到了一個更好的方法,可以使用Bundle類的putSerializable()方法。

補充:

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

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

要檢索:

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

類Exception沒有實現Parcelable接口。除非android打破了我不瞭解的一些基本的Java結構,這意味着你不能把一個Exception作爲一個Parcel放到一個Bundle中。

如果您想將執行「傳遞」到新的活動,只需將新活動中需要的方面捆綁在一起即可。例如,假設您只想傳遞異常消息和堆棧跟蹤。你最好使這樣的事情:

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

其中getStackTraceArray看起來是這樣的:

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

哈哈,我不應該承擔。有沒有更好的方式將信息傳遞給活動? –

+0

使之一:公共類ParcelableException擴展異常實現Parcelable {...} – yorkw

+0

更新我的答案來解決這個問題。 –