2013-08-26 38 views
2

我想記錄自己的錯誤後故意使應用程序崩潰。處理程序在Application.onCreate()中註冊:Thread.setDefaultUncaughtExceptionHandler中的應用程序崩潰

// set global exception handler 
Thread.setDefaultUncaughtExceptionHandler(new UncaughtExceptionHandler() { 
@Override 
public void uncaughtException(Thread thread, final Throwable ex) { 
    // unregister 
    Thread.setDefaultUncaughtExceptionHandler(null); 

    // do report ... 

    // crash app -does not work, app is frozen 
    if (ex instanceof RuntimeException) 
    throw (RuntimeException) ex; 
    throw new RuntimeException("Re-throw", ex); 
} 

但是,我的應用程序凍結而不是與對話框崩潰。如果我沒有註冊處理程序,我該如何崩潰應用程序?

+0

似乎取消註冊應該在匿名類別外 – aim

+0

您期望發生什麼?當你「重新拋出」時,你已經消除了任何默認的異常處理,並且你應該期待你的應用在這一點上很難崩潰。 – chrylis

+0

@chrylis正是我想要的 - 但它不會崩潰,它凍結,甚至不顯示ANR。 – Flo

回答

5

這段代碼永遠不會工作。

未被捕獲的異常處理程序在之後被調用由於未捕獲到異常,線程已終止。如果你試圖重新拋出異常,那麼就沒有別的辦法了。

  • 如果您想要在正常情況下處理重新拋出的異常,則必須在堆棧中進一步執行日誌記錄。

  • 您唯一的其他選擇是明確鏈到另一個UncaughtExceptionHandler


嫌疑這是你所遇到的凍結是當前線程死亡的直接後果。


跟帖:

...有沒有在Android的一些其他的方式來攔截在全球範圍內的異常,而無需使用Thread.setDefaultUncaughtExceptionHandler?

AFAIK,no。

或者鏈接是怎樣的?

事情是這樣的:

public void uncaughtException(Thread thread, final Throwable ex) { 
    // do report ... 

    getSomeOtherHandler(...).uncaughtException(thread, ex); 
} 

或者,因爲線程組實現UncaughtExceptionHandler,...

public void uncaughtException(Thread thread, final Throwable ex) { 
    // do report ... 

    thread.getThreadGoup().uncaughtException(thread, ex); 
} 

基本上,你只需要調用一些其他的處理程序。這不是火箭科學。

但是請注意,一旦您登陸這些處理程序之一,就無法從「正常」方式的異常中捕獲和恢復。

+0

感謝這個信息 - 在沒有使用'Thread.setDefaultUncaughtExceptionHandler'的情況下,Android是否有一些其他的方法來攔截全局級別的異常?或者鏈接如何? – Flo