3

我想在记录自己的错误后故意使我的应用程序崩溃。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);
}

但是,我的应用程序冻结而不是因对话框而崩溃。如果我没有注册处理程序,如何使应用程序崩溃?

4

1 回答 1

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

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

但是请注意,一旦您进入这些处理程序之一,您就无法以“正常”方式捕获异常并从异常中恢复。

于 2013-08-26T09:42:01.837 回答