Thread.setDefaultUncaughtExceptionHandler中的崩溃应用程序

Flo*_*Flo 3 java crash error-handling android

在记录我自己的错误后,我想故意崩溃我的应用程序.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);
}
Run Code Online (Sandbox Code Playgroud)

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

Ste*_*n C 6

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

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

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

  • 您唯一的另一个选择是明确地链接到另一个UncaughtExceptionHandler.


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


跟进:

...在Android中是否有其他方法可以在不使用Thread.setDefaultUncaughtExceptionHandler的情况下拦截全局级别的异常?

AFAIK,没有.

或者链接怎么样?

像这样的东西:

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

    getSomeOtherHandler(...).uncaughtException(thread, ex);
}
Run Code Online (Sandbox Code Playgroud)

或者,自ThreadGroup实现UncaughtExceptionHandler,...

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

    thread.getThreadGoup().uncaughtException(thread, ex);
}
Run Code Online (Sandbox Code Playgroud)

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

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