异常捕获层次结构过程

时间:2014-03-11 23:40:50

标签: java spring exception spring-mvc exception-handling

我在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捕获?

4 个答案:

答案 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