我可以在同一个catch子句中捕获多个Java异常吗?
本文翻译自:Can I catch multiple Java exceptions in the same catch clause?
In Java, I want to do something like this: 在Java中,我想做这样的事情:
try {...
} catch (/* code to catch IllegalArgumentException, SecurityException, IllegalAccessException, and NoSuchFieldException at the same time */) {someCode();
}
...instead of: ...代替:
try {...
} catch (IllegalArgumentException e) {someCode();
} catch (SecurityException e) {someCode();
} catch (IllegalAccessException e) {someCode();
} catch (NoSuchFieldException e) {someCode();
}
Is there any way to do this? 有没有办法做到这一点?
#1楼
参考:https://stackoom.com/question/EfRu/我可以在同一个catch子句中捕获多个Java异常吗
#2楼
Not exactly before Java 7 but, I would do something like this: 不完全是在Java 7之前,但我会做这样的事情:
Java 6 and before 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 Java 7
try {//.....
} catch ( IllegalArgumentException | SecurityException |IllegalAccessException |NoSuchFieldException exc) {someCode();
}
#3楼
A cleaner (but less verbose, and perhaps not as preferred) alternative to user454322's answer on Java 6 (ie, Android) would be to catch all Exception
s and re-throw RuntimeException
s. 用户454322对Java 6(即Android)的回答更清晰(但不那么冗长,也许不是首选)将是捕获所有Exception
并重新抛出RuntimeException
。 This wouldn't work if you're planning on catching other types of exceptions further up the stack (unless you also re-throw them), but will effectively catch all checked exceptions. 如果您计划在堆栈中进一步捕获其他类型的异常(除非您也重新抛出它们),这将无法工作,但会有效地捕获所有已检查的异常。
For instance: 例如:
try {// CODE THAT THROWS EXCEPTION
} catch (Exception e) {if (e instanceof RuntimeException) {// this exception was not expected, so re-throw itthrow e;} else {// YOUR CODE FOR ALL CHECKED EXCEPTIONS}
}
That being said, for verbosity, it might be best to set a boolean or some other variable and based on that execute some code after the try-catch block. 话虽如此,为了详细说明,最好设置一个布尔值或其他变量,并根据它在try-catch块之后执行一些代码。
#4楼
In pre-7 how about: 在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.}
#5楼
No, one per customer. 不,每个客户一个。
You can catch a superclass, like java.lang.Exception, as long as you take the same action in all cases. 只要在所有情况下采取相同的操作,您就可以捕获超类,例如java.lang.Exception。
try {// some code
} catch(Exception e) { //All exceptions are caught here as all are inheriting java.lang.Exceptione.printStackTrace();
}
But that might not be the best practice. 但这可能不是最好的做法。 You should only catch an exception when you have a strategy for actually handling it - and logging and rethrowing is not "handling it". 只有在实际处理它的策略时才应该捕获异常 - 并且日志记录和重新抛出不是“处理它”。 If you don't have a corrective action, better to add it to the method signature and let it bubble up to someone that can handle the situation. 如果您没有采取纠正措施,最好将其添加到方法签名中,然后让它冒泡到可以处理这种情况的人。
#6楼
Catch the exception that happens to be a parent class in the exception hierarchy. 捕获异常层次结构中恰好是父类的异常。 This is of course, bad practice . 这当然是不好的做法 。 In your case, the common parent exception happens to be the Exception class, and catching any exception that is an instance of Exception, is indeed bad practice - exceptions like NullPointerException are usually programming errors and should usually be resolved by checking for null values. 在您的情况下,公共父异常恰好是Exception类,并且捕获任何异常实例的异常,确实是不好的做法 - 像NullPointerException这样的异常通常是编程错误,通常应该通过检查空值来解决。
我可以在同一个catch子句中捕获多个Java异常吗?相关推荐
- java如何捕获多个异常_是否可以在单个catch块中捕获多个Java异常?
例外是程序执行期间发生的问题(运行时错误).发生异常时,程序会突然终止,并且生成异常的行之后的代码将永远不会执行. 代码中有多个异常 在Java 7之前,只要我们有一个可能会生成多个异常的代码,并且如 ...
- python捕获所有异常状态_如何在scrapy中捕获并处理各种异常
前言 使用scrapy进行大型爬取任务的时候(爬取耗时以天为单位),无论主机网速多好,爬完之后总会发现scrapy日志中"item_scraped_count"不等于预先的种子数量 ...
- 如何在scrapy中捕获并处理各种异常
前言 使用scrapy进行大型爬取任务的时候(爬取耗时以天为单位),无论主机网速多好,爬完之后总会发现scrapy日志中"item_scraped_count"不等于预先的 ...
- [Scrapy使用技巧] 如何在scrapy中捕获并处理各种异常
前言 使用scrapy进行大型爬取任务的时候(爬取耗时以天为单位),无论主机网速多好,爬完之后总会发现scrapy日志中"item_scraped_count"不等于预先的 ...
- java方法被编译器调用_我异常了,快来捕获我,Java异常简述
在我们日常编程中,异常处理是必不可少的,异常处理是否得当关系到程序的健壮性和后续维护成本. 试想一下,如果一个项目从头到尾没有考虑过异常处理,当程序出错从哪里寻找出错的根源?但是如果一个项目异常处理设 ...
- java请求超时异常捕获_我异常了,快来捕获我,Java异常简述
在我们日常编程中,异常处理是必不可少的,异常处理是否得当关系到程序的健壮性和后续维护成本. 试想一下,如果一个项目从头到尾没有考虑过异常处理,当程序出错从哪里寻找出错的根源?但是如果一个项目异常处理设 ...
- java异常—— finally 子句+带资源的 try语句
[0]README 0.1) 本文描述+源代码均 转自 core java volume 1, 旨在理解 java异常-- finally 子句+带资源的 try语句 的相关知识: [1] final ...
- java catch子句的排列,对于catch子句的排列
19.在异常处理中,如释放资源.关闭文件.关闭数据库等由( A.try 子句 B.catch 子句 C.finally 子句 D.throw 子句 20.对于 catch 子句的排列,下列哪种是... ...
- try catch finally 中包含return的几种情况,及返回结果
第一种情况:在try和catch中有return,finally中没有return,且finally中没有对try或catch中要 return数据进行操作的代码,这种情况也是最好理解的. publi ...
最新文章
- 一起谈.NET技术,专访微软MVP衣明志:走进ASP.NET MVC 2框架开发
- python-docx 使用教程_python docx 中文字体设置的操作方法
- struts2中result的type跳转类型总结
- `MediaDevices.getUserMedia` `undefined` 的问题
- 《Python数据科学实践指南》——0.2节如何成为数据科学家
- require的key一个坑
- 产品设计的Kawaiization
- 微软u盘安装工具_使用微软Winget工具安装软件教程
- [html] 制作一个多选的下拉框
- 表单oninput和onchange事件区别
- 富文本编辑器:Typora(编辑与预览一体化)
- php类的实例化方法,php中类的定义和实例化方法
- IOS解惑(1)之@property(nonatomic,getter=isOn) BOOL on;中的getter解惑
- java elasticsearch_在Spring java框架中使用ElasticSearch的最佳方式
- 第二章 HTML5存储 Web存储
- ios计时器失效_iOS计时器
- jmeter下载图片
- 数据通信与计算机网络第2版,数据通信与计算机网络(第2版)习题1
- 《分布式系统原理与范型》习题答案 5.同步
- cve20190708补丁的kb名称_2019-6微软安全更新补丁KB4503269
热门文章
- HasMany() = (1..*) HasOptional() = (1..0,1) HasRequired() = (1..1)
- thinkphp 关联模型配置代码
- 【育儿日记2】兔子不要上幼儿园
- 下载网页内容,并编译生成CHM文件
- CLR via C#, Third Edition图书推荐及下载
- 根据指定字段排序编号(SQL Server 2005,Update,Order By)
- 域名解析中的cname解析和显性URL跳转和隐性URL跳转三者有什么区别
- 【u249】新斯诺克
- 关于js拷贝对象的问题
- Excel中MATCH函数的正确使用