【问题标题】:Crash app in Thread.setDefaultUncaughtExceptionHandlerThread.setDefaultUncaughtExceptionHandler 中的应用程序崩溃
【发布时间】:2013-08-28 17:37:07
【问题描述】:

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

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

【问题讨论】:

  • 看来注销应该在匿名类之外
  • 您期望发生什么?当你“重新抛出”时,你已经消除了任何默认的异常处理,你应该期望你的应用程序在那个时候严重崩溃。
  • @chrylis 这正是我想要的 - 但它不会崩溃,它会冻结,甚至 ANR 都没有显示。
  • @Flo 我不确定您所看到的是不是崩溃。您仍然可以使用主页按钮退出应用程序吗?如果是这样,只是冻结正是我所期望的一个严重崩溃的 Android 进程的行为方式。 LogCat 是怎么说的?

标签: java android error-handling crash


【解决方案1】:

这段代码永远不会工作。

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

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

  • 您唯一的其他选择是显式链接到另一个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);
}

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

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

【讨论】:

  • 感谢您提供此信息 - Android 中是否还有其他方法可以在不使用 Thread.setDefaultUncaughtExceptionHandler 的情况下拦截全局级别的异常?或者链接会是什么样子?
猜你喜欢
  • 2011-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-11
  • 2012-03-07
相关资源
最近更新 更多