如何重新引发异常

在我的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());
    }
});

它工作正常,但我想找回系统向用户显示强制关闭对话框的默认行为。

如果我尝试用 a 替换调用,编译器会抱怨我需要用 try/catch 包围它。KillProcess()throw throwable

如果我用尝试/捕获包围它:

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

如何重新投掷该可投掷物品?这样,除了信息之外,系统的行为与以前完全相同:就像我从来没有设置默认的UncaughtException处理程序一样。Log.e()


答案 1

尝试:

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

改编自这个答案。


答案 2

如果设置默认的未捕获异常处理程序,则应该在其中使用异常。这反映在没有宣布任何例外的事实中。uncaughtException

应该没有明显的理由重新抛出它。它将第二次打印在日志中,线程无论如何都会死掉。如果你真的想要这样,那么只需包装可扔进去并重新投掷。RuntimeException


推荐