fro*_*die 668 java exception try-catch multi-catch
在Java中,我想做这样的事情:
try {
...
} catch (/* code to catch IllegalArgumentException, SecurityException,
IllegalAccessException, and NoSuchFieldException at the same time */) {
someCode();
}
Run Code Online (Sandbox Code Playgroud)
...代替:
try {
...
} catch (IllegalArgumentException e) {
someCode();
} catch (SecurityException e) {
someCode();
} catch (IllegalAccessException e) {
someCode();
} catch (NoSuchFieldException e) {
someCode();
}
Run Code Online (Sandbox Code Playgroud)
有没有办法做到这一点?
Osc*_*Ryz 1083
自Java 7以来,这是可能的.多捕获块的语法是:
try {
...
} catch (IOException | SQLException ex) {
...
}
Run Code Online (Sandbox Code Playgroud)
但请记住,如果所有异常都属于同一个类层次结构,则可以简单地捕获该基本异常类型.
另请注意,如果ExceptionB直接或间接地从ExceptionA继承,则无法在同一块中捕获ExceptionA和ExceptionB.编译器会抱怨:
Alternatives in a multi-catch statement cannot be related by subclassing
Alternative ExceptionB is a subclass of alternative ExceptionA
Run Code Online (Sandbox Code Playgroud)
use*_*322 103
不完全是在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);
}
}
Run Code Online (Sandbox Code Playgroud)
Java 7
try {
//.....
} catch ( IllegalArgumentException | SecurityException |
IllegalAccessException |NoSuchFieldException exc) {
someCode();
}
Run Code Online (Sandbox Code Playgroud)
cru*_*sam 23
在Java 7中,您可以定义多个catch子句,如:
catch (IllegalArgumentException | SecurityException e)
{
...
}
Run Code Online (Sandbox Code Playgroud)
duf*_*ymo 15
不,每个客户一个.
只要在所有情况下采取相同的操作,您就可以捕获超类,例如java.lang.Exception.
try {
// some code
} catch(Exception e) { //All exceptions are caught here as all are inheriting java.lang.Exception
e.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)
但这可能不是最好的做法.只有在实际处理它的策略时才应该捕获异常 - 并且日志记录和重新抛出不是"处理它".如果您没有采取纠正措施,最好将其添加到方法签名中,然后让它冒泡到可以处理这种情况的人.
Mic*_*sin 14
如果存在异常层次结构,则可以使用基类来捕获所有异常子类.在简并的情况下,您可以捕获所有 Java异常:
try {
...
} catch (Exception e) {
someCode();
}
Run Code Online (Sandbox Code Playgroud)
在更常见的情况下,如果RepositoryException是基类,而PathNotFoundException是派生类,则:
try {
...
} catch (RepositoryException re) {
someCode();
} catch (Exception e) {
someCode();
}
Run Code Online (Sandbox Code Playgroud)
上面的代码将捕获RepositoryException和PathNotFoundException以进行一种异常处理,并将所有其他异常集中在一起.从Java 7开始,按照@ OscarRyz的回答:
try {
...
} catch( IOException | SQLException ex ) {
...
}
Run Code Online (Sandbox Code Playgroud)
Ole*_*ich 10
用户454322对Java 6(即Android)的回答更清晰(但不那么详细,也许不是首选)将是捕获所有Exception
s并重新抛出RuntimeException
s.如果您计划在堆栈中进一步捕获其他类型的异常(除非您也重新抛出它们),这将无法工作,但会有效地捕获所有已检查的异常.
例如:
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
}
}
Run Code Online (Sandbox Code Playgroud)
话虽如此,为了详细说明,最好设置一个布尔值或其他变量,并根据它在try-catch块之后执行一些代码.
归档时间: |
|
查看次数: |
461793 次 |
最近记录: |