我正在java中实现具有多个异常的异常处理。
请看以下场景:函数 f1 引发异常 e1、e2、e3 和 e4函数 f2 捕获这些。
现在我想通过捕获(异常 e1 和 e2(显式捕获 e1,e2,其他异常应该通过捕获(异常 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
}
我的问题是异常类型1(e1(是否也会被异常e捕获?
规范写道:
如果 try 块的执行由于抛出值 V 而突然完成,则有一个选择:
如果 V 的运行时类型与 try 语句的任何 catch 子句的可捕获异常类 (§5.2( 赋值兼容,则选择第一个(最左边的(此类 catch 子句。值 V 被分配给所选 catch 子句的参数,并执行该 catch 子句的 Block,然后有一个选择:
如果该块正常完成,则 try 语句正常完成。
如果该块由于任何原因突然完成,则 try 语句出于同样的原因突然完成。
因此,最多将执行一个 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
}
使用您的代码将捕获catch(Exception e1){...}
中的所有异常
其他catch
块未使用。如果你想以不同的方式处理不同的Exception
类型,你必须为catch(...)
提供其他Exception
类型。
喜欢
try{
}catch(IOException e1){
// Do sth
}
catch(NullPointerException e2){
// Do sth else
}
// and so on...
您不能有多个具有相同类的捕获块,即 Exception
如果您有多个Exceptions
则需要为每个类创建一个单独的类,并为特定类创建 catch 块
请注意,您的 catch 块的顺序必须从更具体的类变为更通用的类
例如
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
。否则,将为Exception
类的任何实例执行带有 Exception
的 catch
块,该实例未在前catch
块中捕获
最后,Throwable
将捕获任何非Exception
固有的东西,例如Error