Thread.setDefaultUncaughtExceptionHandler中的崩溃应用程序

时间:2013-08-26 09:12:24

标签: java android error-handling crash

我想在记录自己的错误后故意崩溃我的应用程序。 Handler在Application.onCreate()中注册:

// 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);
}

然而,我的应用程序冻结而不是崩溃对话框。如果我没有注册处理程序,我怎么能崩溃应用程序呢?

1 个答案:

答案 0 :(得分:6)

这段代码永远不会起作用。

由于未捕获的异常导致线程终止后,未被捕获的异常处理程序称为。如果您然后尝试重新抛出异常,则没有其他任何东西可以捕获它。

  • 如果您希望在正常情况下处理重新抛出的异常,则必须在堆栈中进一步记录。

  • 您唯一的另一个选择是显式链接到另一个UncaughtExceptionHandler


怀疑您遇到的冻结是当前线程死亡的直接后果。


<强>随访:

  

...在Android中是否有其他方法可以在全局范围内拦截异常,而无需使用Thread.setDefaultUncaughtExceptionHandler?

AFAIK,没有。

  

链接怎么样?

这样的事情:

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

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

或者,因为ThreadGroup实现了UncaughtExceptionHandler,...

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

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

基本上,你只需要调用其他一些处理程序。这不是火箭科学。

但请注意,一旦您登陆其中一个处理程序,就无法以“正常”方式捕获并从异常中恢复。