首页 文章

我可以在同一个catch子句中捕获多个Java异常吗?

提问于
浏览
589

在Java中,我想做这样的事情:

try {
    ...     
} catch (/* code to catch IllegalArgumentException, SecurityException, 
            IllegalAccessException, and NoSuchFieldException at the same time */) {
   someCode();
}

...代替:

try {
    ...     
} catch (IllegalArgumentException e) {
    someCode();
} catch (SecurityException e) {
    someCode();
} catch (IllegalAccessException e) {
    someCode();
} catch (NoSuchFieldException e) {
    someCode();
}

有没有办法做到这一点?

9 回答

  • 9

    是 . 这是使用管道(|)分隔符的方式,

    try
    {
        .......
    }    
    catch
    {
        catch(IllegalArgumentException | SecurityException | IllegalAccessException | NoSuchFieldException e)
    }
    
  • 13

    不,每个客户一个 .

    只要在所有情况下执行相同的操作,就可以捕获超类,例如java.lang.Exception .

    try {
        // some code
    } catch(Exception e) { //All exceptions are caught here as all are inheriting java.lang.Exception
        e.printStackTrace();
    }
    

    但这可能不是最好的做法 . 只有当你有实际处理它的策略时才应该捕获异常 - 并且日志记录和重新抛出不是“处理它” . 如果您没有采取纠正措施,最好将其添加到方法签名中,然后让它冒泡到可以处理这种情况的人 .

  • 15

    在Java 7中,您可以定义多个catch子句,如:

    catch (IllegalArgumentException | SecurityException e)
    {
        ...
    }
    
  • 0

    在7之前如何:

    Boolean   caught = true;
      Exception e;
      try {
         ...
         caught = false;
      } catch (TransformerException te) {
         e = te;
      } catch (SocketException se) {
         e = se;
      } catch (IOException ie) {
         e = ie;
      }
      if (caught) {
         someCode(); // You can reference Exception e here.
      }
    
  • 967

    用户454322对Java 6(即Android)的回答更清晰(但不那么详细,也许不是首选)将是捕获所有 Exception 并重新抛出 RuntimeException . 这样就不会计划在堆栈中进一步捕获其他类型的异常(除非你也重新抛出它们),但是会有效地捕获所有已检查的异常 .

    例如:

    try {
        // CODE THAT THROWS EXCEPTION
    } catch (Exception e) {
        if (e instanceof RuntimeException) {
            // this exception was not expected, so re-throw it
            throw e;
        } else {
            // YOUR CODE FOR ALL CHECKED EXCEPTIONS
        } 
    }
    

    话虽如此,为了详细说明,最好设置一个布尔值或其他变量,并根据它在try-catch块之后执行一些代码 .

  • 23

    如果存在异常层次结构,则可以使用基类来捕获所有异常子类 . 在简并的情况下,您可以捕获 all Java异常:

    try {
       ...
    } catch (Exception e) {
       someCode();
    }
    

    在更常见的情况下,如果RepositoryException是基类,而PathNotFoundException是派生类,则:

    try {
       ...
    } catch (RepositoryException re) {
       someCode();
    } catch (Exception e) {
       someCode();
    }
    

    上面的代码将捕获RepositoryException和PathNotFoundException以进行一种异常处理,并将所有其他异常集中在一起 . 从Java 7开始,按照@ OscarRyz的回答:

    try { 
      ...
    } catch( IOException | SQLException ex ) { 
      ...
    }
    
  • 100

    捕获异常层次结构中恰好是父类的异常 . This is of course, bad practice . 在您的情况下,公共父异常碰巧是Exception类,并且捕获任何异常实例的异常,确实是不好的做法 - 像NullPointerException这样的异常通常是编程错误,通常应该通过检查空值来解决 .

  • 3

    这有可能since Java 7 . 多捕获块的语法是:

    try { 
      ...
    } catch (IOException | SQLException ex) { 
      ...
    }
    

    但请记住,如果所有异常都属于同一个类层次结构,则可以简单地捕获该基本异常类型 .

    另请注意,如果ExceptionB直接或间接地从ExceptionA继承,则无法在同一块中捕获ExceptionA和ExceptionB . 编译器会抱怨:

    Alternatives in a multi-catch statement cannot be related by subclassing
      Alternative ExceptionB is a subclass of alternative ExceptionA
    
  • 0

    不完全是在Java 7之前,但我会做这样的事情:

    Java 6和之前的版本

    try {
      //.....
    } catch (Exception exc) {
      if (exc instanceof IllegalArgumentException || exc instanceof SecurityException || 
         exc instanceof IllegalAccessException || exc instanceof NoSuchFieldException ) {
    
         someCode();
    
      } else if (exc instanceof RuntimeException) {
         throw (RuntimeException) exc;     
    
      } else {
        throw new RuntimeException(exc);
      }
    
    }
    

    Java 7

    try {
      //.....
    } catch ( IllegalArgumentException | SecurityException |
             IllegalAccessException |NoSuchFieldException exc) {
      someCode();
    }
    

相关问题