赞
踩
Java语言按照错误严重性,从throwale根类衍生出Error和Exception两大派系:
EXCEPTION(异常)按照性质,又分为编译异常(可检测)和运行时异常(不可检测):
说到异常处理,这里就不得不提try/catch/finally。try不可以单独存在,要么搭配catch,要么搭配finally,或者三者并存:
① 代码执行流程未进入try代码块。
② 代码在try代码块中发生死循环、死锁等状态。
③ 在try代码块中执行了System.exit()操作。
1、不处理
遇到异常问题不进行具体处理,而是继续抛给调用者 (throw,throws)
抛出异常有三种形式:
- public static void main(String[] args) {
- String s = "abc";
- if(s.equals("abc")) {
- // 手动抛出一个数字格式化异常
- throw new NumberFormatException();
- } else {
- System.out.println(s);
- }
- }
-
- int div(int a,int b) throws Exception{
- return a/b;
- }
throws和throw区别:
2、处理
- void doA(int a) throws IOException,{
- try{
- ......
- }catch(Exception1 e){
- throw e;
- }catch(Exception2 e){
- System.out.println("出错了!");
- }
- if(a!=b)
- throw new Exception3("自定义异常");
- }
好了,前面简单介绍了异常的分类以及try/catch/finally的注意事项,现在可以总结一下我们在异常处理的时候有哪些”最佳实践“了。
当需要向上抛出异常的时候,需根据当前业务场景定义具有业务含义的异常,优先使用行业内定义的异常或者团队内部定义好的。例如在使用dubbo进行远程服务调用超时的时候会抛出DubboTimeoutException,而不是直接把RuntimeException抛出。
请勿在finally代码块中使用return语句,避免返回值的判断变得复杂。
捕获异常具体的子类,而不是Exception,更不是throwable。这样会捕获所有的错误,包括JVM抛出的无法处理的严重错误。
切记更别忽视任何一个异常(catch住了不做任何处理),即使现在能确保不影响逻辑的正常运行,但是对于将来谁都无法保证代码会如何改动,别给自己挖坑。
不要使用异常当作控制流程来使用,这是一个很奇葩也很影响性能的做法。
清理资源,释放连接等操作一定要放在finally代码块中,防止内存泄漏,如果finally块处理的逻辑比较多且模块化,我们可以封装成工具方法调用,代码会比较简洁。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。