java - Thread.setDefaultUncaughtExceptionHandler 中的应用程序崩溃

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

但是,我的应用程序卡住而不是崩溃并显示对话框。如果我没有注册处理程序,我该如何使应用程序崩溃?

最佳答案

这段代码永远行不通。

未捕获的异常处理程序在线程由于未捕获的异常而终止后被调用。如果您然后尝试重新抛出异常,将没有其他东西可以捕获它。

  • 如果您希望正常处理重新抛出的异常,则必须在堆栈的更上层进行日志记录。

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


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


跟进:

... is there some other way in Android to intercept exceptions at a global level, without using Thread.setDefaultUncaughtExceptionHandler?

据我所知,不。

Or how would the chaining look like?

像这样:

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

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

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

关于java - Thread.setDefaultUncaughtExceptionHandler 中的应用程序崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18440592/

相关文章:

java - 如何计算 BigDecimal

java - 如何在 Java 中删除/忽略 JSON { 和 ] 之前的引号

java - 在向列表中添加另一个数字之前,如何检查列表中是否有重复项?

java - 如何在 JDK 11 中运行 JDK 8 Java Web 应用程序?

javascript - Promise 是否捕获了太多错误?

c++ - 如何处理 float 溢出?

android - 编译器提示类型错误,但它显然是正确的

java - 如何在 android java 中使用插值获得类似的 tweenmax 效果?

android - 从样式加载这些属性时,一个或多个布局缺少布局高度和布局宽度错误

visual-c++ - WinRT-Windows应用商店-WinRT原始错误-如何解密此类错误?