我可以在同一个catch子句中捕获多个Javaexception吗?
在Java中,我想要做这样的事情:
try { ... } catch (IllegalArgumentException, SecurityException, IllegalAccessException, NoSuchFieldException e) { someCode(); }
…代替:
try { ... } catch (IllegalArgumentException e) { someCode(); } catch (SecurityException e) { someCode(); } catch (IllegalAccessException e) { someCode(); } catch (NoSuchFieldException e) { someCode(); }
有没有办法做到这一点?
这是可能的, 因为Java 7 。 try-catch块的语法是:
try { ... } catch (IOException | SQLException ex) { ... }
在Java 7之前,这是不可能的。 但请记住,如果所有exception属于同一个类层次结构,那么您可以简单地捕获该基本exceptiontypes。 唯一的另一种方法是捕捉每个exception在自己的catch块中。
编辑:请注意,在Java 7中,如果ExceptionB是从ExceptionA直接或间接inheritance的,则无法在同一个块中同时捕获ExceptionA和ExceptionB。 编译器会抱怨: The exception ExceptionB is already caught by the alternative ExceptionA
。
不是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(); }
在Java 7中,您可以定义多个catch子句,如:
catch (IllegalArgumentException | SecurityException e) { ... }
不,每个客户一个。
只要您在所有情况下都采取相同的操作,就可以捕获超类,如java.lang.Exception。
try { // some code } catch(Exception e) { //All exceptions are caught here as all are inheriting java.lang.Exception e.printStackTrace(); }
但这可能不是最好的做法。 当你有一个实际处理策略的时候,你应该只捕获一个exception,而logging和重新抛出不是“处理它”。 如果您没有纠正措施,最好将其添加到方法签名中,然后让其处理。
如果存在exception的层次结构,则可以使用基类来捕获exception的所有子类。 在退化情况下,您可以通过以下方式捕获所有 Javaexception:
try { ... } catch (Exception e) { someCode(); }
在更常见的情况下,如果RepositoryException是基类,并且PathNotFoundException是派生类,那么:
try { ... } catch (RepositoryException re) { someCode(); } catch (Exception e) { someCode(); }
上面的代码会捕获RepositoryException和PathNotFoundExceptionexception处理的一种,所有其他exception都集中在一起。 从Java 7开始,按照上面的@ OscarRyz的回答:
try { ... } catch( IOException | SQLException ex ) { ... }
在Java 6(也就是Android)上,user454322的答案可以替代清除器(但不是那么详细,也可能不是首选),而是捕获所有Exception
并重新抛出RuntimeException
。 如果你打算在栈上进一步捕获其他types的exception(除非你也重新抛出exception),这将不起作用,但是会有效地捕获所有检查的exception。
例如:
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 } }
这就是说,对于冗长,最好是设置一个布尔值或其他一些variables,并基于try-catch块后执行一些代码。
在前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. }
是的,你可以在Java 7中看到这个例子
try { //your code } catch(SQLException | IOException ex) { }
但是你需要记住一些多重捕获的规则,你可以在http://pictorialjava.blogspot.in/2015/11/exception-handling-in-java-7.html上find
Java SE 7及更高版本的多个catch语句可能如下所示。
try{ // business logic.... } catch(IOException | SQLException ex){ // handle exception of both types... }
请注意…
- 单个catch块可以处理多种types的exception。
-
这两个exception不应该是相同的types,即你不能在单个catch块中捕获IOException或SQLException的子类exception。
-
捕捉参数ex是明确的最后,你不能给它分配任何值。
-
所有exception都应该用垂直竖线(|)分隔。
捕获碰巧是exception层次结构中的父类的exception。 这当然是不好的做法 。 在你的情况下,常见的父exception恰好是Exception类,并且捕获任何exception是Exception的实例,这实际上是不好的做法 – 类似于NullPointerException的exception通常是编程错误,通常应该通过检查空值来解决。
try { ... } catch (IllegalArgumentException | SecurityException | IllegalAccessException | NoSuchFieldException e) { //even you can check here like if(e instanceof IllegalArgumentException){ //like wise you can check the type of the exception, its just an info may not required } someCode(); }
是的你可以…
catch(ArithmeticException | ArrayIndexOutOfBounds | RunTimeException | Exception ex){ex.printStackTrace(); }
你必须把更具体的例外..第一个子类,然后超类…
- 如何使用RSpec的should_raise与任何exception?
- 别名为chrome console.log
- 最佳做法:从属性抛出exception
- 如何find在C ++中抛出exception?
- 我应该使用nunit的Assert.Throws方法还是Expected Exception属性?
- 在Java中,什么时候应该创build一个检查的exception,什么时候应该是一个运行时exception?
- 是一个没有捕获块java终止模式的反模式?
- C#中有像Java一样的throws关键字吗?
- 我是否需要创build自己的InvalidArgumentException ..我无法find任何内置types在c#