Java 异常处理
相信很多了解 Java 的人对于通过 try-catch-finally 来处理异常应该都有所了解了。但可能很多人在实际中还只是仅仅将代码包起来,然后在 catch 中输出错误信息而已,但是 Java 的异常处理其实也有很多要注意的地方。
基础
Java 中的异常处理都是围绕着 try-catch-finally, throw, throws 这几个展开的,也就是:
try-catch-finally:捕获异常并处理。
throw:遇到错误的时候抛出一个异常。
throws:声明一个方法可能抛出的异常(所有可能抛出的异常都需要声明)。
Java 中的异常分为 checked exception 和 unchecked exception。
java.lang.RuntimeException 和 java.lang.Error 类及其子类是 unchecked exception,其余的就是 checked exception 了。
当你在进行 API 设计时,必须要知道异常声明也是 API 的一部分。如果你为你公开的 API 声明了可能抛出的异常,在今后很长的一段时间里你可能都很难甩掉它们了。
今后如果你要重构或进一步开发这些 API 时,就不得不考虑这些异常带来的向后兼容性问题。因为,如果你在日后的版本中删除了某个异常的声明,就会造成之前用户的代码无法通过编译。
仔细考虑你要声明抛出的异常。
异常处理
异常处理的难点主要是对于什么时候处理异常的理解上。在不同的抽象层级上,你要考虑这个异常是不是应该在这个层级上进行处理,还是说应该继续向上抛出,甚至某些情况下还需要包装捕获到的低级异常,再向上抛出。
填写下面表单即可预约申请免费试听java课程!害怕学不会?助教全程陪读,随时解惑!担心就业?一地学习,可全国推荐就业!
不同抽象层级上的代码应该只声明抛出同一层级上的异常。
就像处理界面的代码不应该还会捕获处理数据库操作的异常一样。 为了避免这个问题,更高层次的实现需要捕获低层次的异常,包装之后再抛出属于更高层次的异常。这种做法被称作:Exception translation。
当然最完美的情况还是事先完美的层次设计,在调用低层级的方法之前确保它们无论如何都能成功执行,从根本上避免低层抛出异常。实在避免不了,再使用 Exception translation。
在具体处理异常的地方,应当使 try-catch 块尽可能的小,catch 尽可能具体的异常。千万不要捕获 Exception 这么宽泛的异常之后就不管了。
尝试把 try-catch 作为程序流程控制的一部分。比如:
这也隐含了一个准则:不要忽略异常。忽略异常最简单的方法就是使用一个空的 catch。即使你确定什么都不需要做,至少也要解释为什么可以什么都不做。
如果你需要自己创建异常,请将对异常的设计放在与程序设计同样的地位。有的开发者可能会用一个大而全的异常类来表示各种不同类型的错误,只通过错误信息来区分不同的错误。这种异常处理方式一方面是不够优雅,另一方面是当你需要进行 Exception translation 时很难对这种大而全的异常进行再包装。
应该仔细设计异常的层次结构,根据不同的情况定义不同的异常类,并在异常类中包含尽量丰富的信息。对于异常提供的信息来说,是程序的内部错误,需要和展示给用户的错误提示区分开来。因此,程序需要保证在和用户交互的层次上,捕获所有抛出的异常,并转换成对应的面向用户的错误提示。
上一篇:JDBC连接池工作原理及问题详解
下一篇:CSS重要属性之overflow
一级建造师二级建造师消防工程师造价工程师土建职称房地产经纪人公路检测工程师建筑八大员注册建筑师二级造价师监理工程师咨询工程师房地产估价师 城乡规划师结构工程师岩土工程师安全工程师设备监理师环境影响评价土地登记代理公路造价师公路监理师化工工程师暖通工程师给排水工程师计量工程师
执业药师执业医师卫生资格考试卫生高级职称护士资格证初级护师主管护师住院医师临床执业医师临床助理医师中医执业医师中医助理医师中西医医师中西医助理口腔执业医师口腔助理医师公共卫生医师公卫助理医师实践技能内科主治医师外科主治医师中医内科主治儿科主治医师妇产科医师西药士/师中药士/师临床检验技师临床医学理论中医理论