我想知道是否有办法编写一个catch语句,只要在程序中抛出任何异常就会激活它。谢谢!
答案 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
类型捕获所有内容。 Throwable
比Exception
更通用,但它仍然按照完全相同的原则运作。它是任何可以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
}
这将处理代码调用的任何异常。