2

我想知道是否有一种方法可以编写一个在程序中抛出任何异常时激活的 catch 语句。谢谢!

4

5 回答 5

14

到目前为止,您收到的答案的问题是,如果您在 main 中包含“catch-all”,它只会捕获主线程上抛出的异常。

捕获所有未捕获异常的更强大的方法是DefaultUncaughtExceptionHandler为您的项目设置一个,例如,在您的 main 开始时,您可以调用:

Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
    @Override
    public void uncaughtException(Thread t, Throwable e) {
        //log the exception
    }
});

请注意,除了登录之外,做任何事情通常都是不合理的,因为这Throwable可能是任何事情,包括不可恢复的错误。

于 2013-04-11T22:38:48.547 回答
2

要捕获某些代码块可能抛出的所有异常,您可以执行以下操作:(这也将捕获您自己编写的异常) From我如何捕获通过读取和写入文件将引发的所有异常?

try {

    // exceptional block of code ...
    // ...
} catch (Exception e){

    // Deal with e as you please.
    //e may be any type of exception at all.
}

之所以有效,是因为 Exception 是所有运行时异常的基类。因此,任何可能抛出的运行时异常都是异常。

这是因为所有运行时异常都继承自 Exception。请注意,Java 中的 Error 和 Exception Unchecked 异常之间存在区别:从 Error 或 RuntimeException 继承?, 在这种情况下,您可能需要执行以下操作:

try {

} catch(Throwable e) {

}

看到这个什么时候应该使用 Throwable 而不是新的异常?. 一位用户指出:

错误在任何情况下都无法通过编程方式恢复,并且通常不会被捕获,除非用于记录目的(再次通过它)。异常可以通过编程方式恢复。它的子类 RuntimeException 表示编程错误,通常也不会被捕获。有关其他信息,请参阅评论。

于 2013-04-11T22:19:15.130 回答
2

你可以制作类型Exception。这将捕获任何Exception,但它也没有给程序员太多关于哪里出了问题的信息。通常最好尝试更具体地了解已发生的异常类型,主要是出于语义原因。

理论

每种类型的 Java 异常都扩展了Exception类型。因为Exception是所有异常的超类,所以当抛出异常时,无论它的类型如何,它仍然可以隐式转换为 type 的对象Exception

编辑

正如评论中提到的,还有Error可以抛出的类型,因此Throwable最好使用该类型真正捕获所有内容。Throwable比 更通用Exception,但它仍然按照完全相同的原理工作。它是任何事物的超类thrown

例如

try{
   // Some code
}
catch(Throwable e)
{
    // Do something. Edited due to comment!
}
于 2013-04-11T22:19:23.913 回答
0

是的,任何失败的错误都会被这个捕获:

try {
    //do things here
} catch (Exception e) {
    //handle exception here
}

但是请注意,这通常是错误的做法。

于 2013-04-11T22:19:35.237 回答
0

在您的主目录中,将所有代码放入

try {
    //Your code
} catch(Exception e) {
    //Handle exceptions 
}

这将处理您的代码调用的任何异常。

于 2013-04-11T22:20:21.910 回答