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