在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();
}

有什么办法吗?


当前回答

如果存在异常的层次结构,则可以使用基类来捕获异常的所有子类。在退化情况下,您可以通过以下方式捕获所有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 ) { 
  ...
}

其他回答

不完全在Java7之前,但我会这样做:

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();
}

捕获恰好是异常层次结构中父类的异常。这当然是不好的做法。在您的案例中,常见的父异常恰好是exception类,捕获任何作为exception实例的异常确实是错误的做法-像NullPointerException这样的异常通常是编程错误,通常应该通过检查空值来解决。

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

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

对于kotlin来说,目前还不可能,但他们已经考虑添加:来源但现在,只需要一个小技巧:

try {
    // code
} catch(ex:Exception) {
    when(ex) {
        is SomeException,
        is AnotherException -> {
            // handle
        }
        else -> throw ex
    }
}

不,在Java 7之前,每个客户一个。

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

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

但这可能不是最佳做法。只有当您有实际处理异常的策略时,才应该捕捉到异常,而日志记录和重新思考并不是“处理它”。如果您没有纠正措施,最好将其添加到方法签名中,让它向能够处理这种情况的人冒泡。

使用JDK 7和更高版本,您可以执行以下操作:

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