在我的onCreate()中,我按如下方式设置了一个UncaughtException处理程序:
Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
@Override
public void uncaughtException(Thread thread, Throwable throwable) {
Log.e(getMethodName(2), "uncaughtException", throwable);
android.os.Process.killProcess(android.os.Process.myPid());
}
});
它工作正常,但我想恢复系统向用户显示强制关闭对话框的默认行为。
如果我尝试用KillProcess()
替换throw throwable
调用,编译器会抱怨我需要用try / catch包围它。
如果我用try / catch包围它:
Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
@Override
public void uncaughtException(Thread thread, Throwable throwable) {
try {
Log.e(getMethodName(2), "uncaughtException", throwable);
throw throwable;
}
catch (Exception e) {
}
finally {
}
}
});
编译器仍然抱怨throw throwable
需要用try / catch包围。
如何重新抛出那个扔掉的?除了信息量Log.e()
之外,系统的行为与以前完全一样:因为我从未设置默认的UncaughtException处理程序。
答案 0 :(得分:19)
尝试:
public class CustomExceptionHandler implements UncaughtExceptionHandler {
private UncaughtExceptionHandler defaultUEH;
public CustomExceptionHandler() {
this.defaultUEH = Thread.getDefaultUncaughtExceptionHandler();
}
public void uncaughtException(Thread t, Throwable e) {
Log.e("Tag", "uncaughtException", throwable);
defaultUEH.uncaughtException(t, e);
}
}
然后
Thread.setDefaultUncaughtExceptionHandler(new CustomExceptionHandler());
改编自this回答。
答案 1 :(得分:3)
如果设置默认的未捕获异常处理程序,则应该在其中使用异常。 uncaughtException
未声明任何异常这一事实反映了这一点。
应该没有明显的理由重新抛出它。它只会在日志中第二次打印而且线程无论如何都会死亡。如果你真的想要那个,那么只需将throwable包装在RuntimeException
并重新抛出。
答案 2 :(得分:2)
没有理由重新抛出Throwable,因为javadoc, it is simply ignored.线程正在终止,你只是在退出之前设置它要做的最后一次动作。
为了争论,如果你想重新抛出一个throwable,你会做这样的事情:
public void reThrow(Throwable t) {
if (RuntimeException.class.isAssignableFrom(t.getClass())) {
throw (RuntimeException)t;
} else if (Error.class.isAssignableFrom(t.getClass())) {
throw (Error) t;
} else {
throw new UndeclaredThrowableException(t);
}
}
答案 3 :(得分:1)
首先,您不需要重新抛出异常。 uncaughtException()
不会消耗此异常。但是你必须调用默认的未捕获异常处理程序的方法。等等,
class MyUEH implements UncaughtExceptionHandler {
private static final UncaughtExceptionHandler default = Thread.getDefaultUncaughtExceptionHandler();
public void uncaughtException(Thread t, Throwable e) {
Log.e("Tag", "uncaughtException", throwable);
default.uncaughtException(t, e);
}
}
第二,你不需要自己杀死这个过程。默认的UEH会在你打电话时处理它。
第三,默认UEH将向用户显示(或导致显示)标准崩溃(强制关闭)对话框。请记住,如果您的方法挂起(因为您正在执行IO),那么在您的方法退出之前,用户将看不到崩溃对话框。