我们可以在没有 catch 块的情况下捕获异常吗?

Can we catch an exception without catch block?

假设我有一个没有 catch 块的 try-finally 块,我们在 try 块中抛出一个异常。我能捕捉到那个异常吗?

public static void main(String[] args) throws IOException{
    try {
        throw new IOException("Something went wrong");
    } finally{
    }
}

是的,有可能。

您可以使用未捕获的异常处理程序。它的职责是捕捉你的程序没有捕捉到的异常,并用它做一些事情。

public static void main(String[] args) throws IOException {
    Thread.setDefaultUncaughtExceptionHandler((thread, thr) -> thr.printStackTrace());
    throw new IOException("Something went wrong");
}

setDefaultUncaughtExceptionHandler 是一种方法,它将注册一个处理程序,当在任何线程中抛出异常但未被捕获时将调用该处理程序。上面的代码将打印处理的 throwable 的堆栈跟踪。

处理程序将发生异常的线程和抛出的 throwable 作为参数。

您还可以通过在 Thread 实例上使用 setUncaughtExceptionHandler 每个线程 拥有一个处理程序 。此处理程序将处理从此线程抛出的所有未捕获异常。