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

其他回答

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

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

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

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

对于Java6(即Android)上的user454322的答案,一个更简洁(但不那么冗长,可能不是首选)的替代方案是捕获所有异常并重新抛出RuntimeExceptions。如果您计划在堆栈的更上层捕获其他类型的异常(除非您也重新抛出它们),这将不起作用,但将有效地捕获所有已检查的异常。

例如:

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块之后执行一些代码。

在pre-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.
  }