我想在记录自己的错误后故意崩溃我的应用程序。 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);
}
然而,我的应用程序冻结而不是崩溃对话框。如果我没有注册处理程序,我怎么能崩溃应用程序呢?
答案 0 :(得分: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);
}
基本上,你只需要调用其他一些处理程序。这不是火箭科学。
但请注意,一旦您登陆其中一个处理程序,就无法以“正常”方式捕获并从异常中恢复。