Universal Catch声明

时间:2013-04-11 22:17:48

标签: java exception error-handling

我想知道是否有办法编写一个catch语句,只要在程序中抛出任何异常就会激活它。谢谢!

5 个答案:

答案 0 :(得分:14)

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

捕获所有未捕获的异常的更有效方法是为您的项目设置DefaultUncaughtExceptionHandler,例如,在您的主要开头,您可以致电:

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

请注意,除了登录之外,执行任何操作通常都是不合理的,因为Throwable可能是任何内容,包括不可恢复的错误。

答案 1 :(得分:2)

要捕获所有异常,可能会抛出一些代码块:(这也会捕获您自己编写的异常) 来自How can I catch all the exceptions that will be thrown through reading and writing a file?

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继承。请注意,错误和异常Unchecked exceptions in Java: Inherit from Error or RuntimeException?之间存在差异,在这种情况下您可能需要这样做:

try {

} catch(Throwable e) {

}

When should Throwable be used instead of new Exception?。一位用户注意到:

错误在程序上无法以任何方式恢复,并且通常不会被捕获,除了记录目的(再次传递它)。异常以编程方式可恢复。它的子类RuntimeException指示编程错误,通常也不会被捕获。有关其他信息,请参阅注释。

答案 2 :(得分:2)

您可以输入Exception类型。这将捕获任何Exception,但它也没有给程序员很多关于出错的信息。通常最好是尝试更加具体地说明已发生的异常的类型,主要是出于语义原因。

理论

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

修改

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

例如

try{
   // Some code
}
catch(Throwable e)
{
    // Do something. Edited due to comment!
}

答案 3 :(得分:0)

是的,任何失败的错误都将被捕获:

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

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

答案 4 :(得分:0)

在您的主要内容中,将所有代码放入

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

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