Java 通用捕获语句

Java 通用捕获语句,java,exception,error-handling,Java,Exception,Error Handling,我想知道是否有一种方法可以编写一个catch语句,在程序中抛出任何异常时激活该语句。谢谢 要捕获所有异常,您可以执行一些代码块抛出的操作:(这也将捕获您自己编写的异常) 从 之所以有效,是因为Exception是所有运行时异常的基类。因此,任何可能引发的运行时异常都是异常 原因是所有运行时异常都继承自异常。请注意,错误和异常之间存在差异,在这种情况下,您可能需要执行以下操作: try { } catch(Throwable e) { } 看这个。一位用户注意到: 错误以任何方式在编程上都是

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

要捕获所有异常,您可以执行一些代码块抛出的操作:(这也将捕获您自己编写的异常) 从

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

原因是所有运行时异常都继承自异常。请注意,错误和异常之间存在差异,在这种情况下,您可能需要执行以下操作:

try {

} catch(Throwable e) {

}
看这个。一位用户注意到:


错误以任何方式在编程上都是不可恢复的,并且通常不会被捕获,除非出于日志记录的目的(这会再次传递错误)。异常可通过编程方式恢复。它的子类RuntimeException表示编程错误,通常也不会被捕获。有关更多信息,请参阅注释。

您可以将类型设置为
异常。这将捕获任何
异常
,但它也不会向程序员提供关于出错原因的太多信息。通常,最好尝试更具体地说明已发生的异常类型,主要是出于语义原因

理论

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

编辑

如注释中所述,还可以抛出类型
Error
,因此最好使用
Throwable
类型来捕获所有内容
Throwable
Exception
更为通用,但它仍然遵循完全相同的原则。它是可以
抛出的任何对象的超类

比如说


是的,任何错误都将被以下程序捕获:

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

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

在主代码中,将所有代码都放进去

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

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

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

捕获所有未捕获异常的更可靠方法是为您的项目设置异常,例如,在main的开头,您可以调用:

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

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

如果你真的想射中自己的脚,你可以随时捕捉到可丢弃的
Error
:)
错误也可以丢弃,不过。。。您可以随时捕获可丢弃的
。应该注意的是,简单地尝试/捕获Main中的所有内容并不一定会对最终用户隐藏所有错误。您引用的任何库都可以有自己的异常处理,并且它们不一定会冒泡出所有的异常。库本身可以选择忽略异常、向最终用户显示堆栈跟踪、将内容记录到文件等,这些操作只会捕获当前线程引发的异常。@assylias很好的一点是,如果他正在创建子线程,他是否需要遵循这些操作(请参阅第一个答案)。还是有更好的办法?@tigger我补充了一个答案。非常有趣。我完全没有意识到这种可能性。谢谢,这正是我想要的!我将使用它,这样每当发生错误时,它都会将错误以电子邮件的形式发送给我。啊。。。!这几乎奏效了!,我需要捕获NPE,但库实现了ExecutionException(似乎捕获了NPE),因此它不起作用:(,将保留所有其他情况下的thx!@AquariusPower没有理由不起作用-我猜您在代码中捕获了
ExecutionException
,而没有查看
e.getCause()的原因
(即NPE)。因此,实际上您正在捕获异常-但忽略它-并且未捕获的异常处理程序未被调用。从字面上看,这是不可能的,因为异常可能已在其抛出点附近被捕获。您所能做的最好方法是捕获所有未被捕获的异常,如@assylias answer中所述。
try {
    //Your code
} catch(Exception e) {
    //Handle exceptions 
}
Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
    @Override
    public void uncaughtException(Thread t, Throwable e) {
        //log the exception
    }
});