我在java中实现异常处理,但有多个例外。
请看以下场景: 函数f1抛出异常e1,e2,e3和e4 函数f2捕获了这些。
现在我想通过catch(异常e1和e2)显式捕获e1,e2,其他异常应该通过catch捕获所有异常块(例外e) 所以e1和e2是一个特例,其他都是一般例外。
以下工作也会如此吗?
try{
//some work`
} catch(ExceptionType1 e1) {
//do some special logging
} catch (ExceptionType2 e2) {
//do some special logging
} catch(Exception e) {
//do general logging for other exceptions
}
我的问题是ExceptionType1(e1)是否也会被Exception e捕获?
答案 0 :(得分:2)
要使其工作,您需要使用具有不同异常的catch块 像NullPointerException NumberFormatException和一般异常将由带有Exception参数的catch块捕获,因为Exception是所有异常的超类
try{
//some work`
} catch(NullPointerException e1) {
//do some special logging
} catch (NumberFormatException e2) {
//do some special logging
} catch(Exception e) {
//do general logging for other exceptions
}
答案 1 :(得分:2)
规范writes:
如果由于抛出值V而导致try块的执行突然完成,那么可以选择:
如果V的运行时类型与(§5.2)兼容try语句的任何catch子句的可捕获异常类,那么第一个(最左边)这样的catch子句被选中。将值V分配给所选catch子句的参数,并执行该catch子句的Block,然后有一个选择:
如果该块正常完成,则try语句正常完成。
如果该块因任何原因突然完成,则try语句会因同样的原因突然完成。
因此,最多只能执行一个catch块。
答案 2 :(得分:1)
使用您的代码将捕获catch(Exception e1){...}
其他catch
- 块未使用。如果您想以不同的方式处理不同的Exception
- 类型,则必须提供catch(...)
其他Exception
类型。
喜欢
try{
}catch(IOException e1){
// Do sth
}
catch(NullPointerException e2){
// Do sth else
}
// and so on...
答案 3 :(得分:1)
您不能拥有同一类的多个catch块,即Exception
如果您有多个Exceptions
,则需要为每个类创建一个单独的类,并为特定类创建catch块
请注意,catch块的顺序必须从更具体的类到更通用的类
e.g。
try {
} catch (FileNotFoundException e) {
System.err.println("FileNotFoundException: " + e.getMessage());
} catch (IOException e) {
System.err.println("Caught IOException: " + e.getMessage());
} catch (Exception e) {
System.err.println("Caught Exception: " + e.getMessage());
} catch (Throwable e) {
System.err.println("Caught Throwable: " + e.getMessage());
}
因此,在上面的代码中,如果异常是FileNotFoundException
,则只会执行第一个catch
。否则,对于catch
类的任何未在先前Exception
块中捕获的实例,将执行Exception
catch
块{/ 1}}
最后Throwable
会抓住Exception
所不具备的任何内容,例如Error