见过不少人在进行异常处理的时候,直接一个 e.printStackTrace() 就完成了,这是一种很是粗陋的作法,首先会致使应用日志的大量错误信息,而不少时候你都不知道这些错误信息因何发生;再者,反应到用户端将直接致使用户没法获取操做的结果以及失败的缘由。sql
如下 15 条异常处理的原则来自国外的博客:数据库
- 1.不用使用异常来管理业务逻辑,应该使用条件语句。若是一个控制逻辑可经过 if-else 语句来简单完成的,那就不用使用异常,由于异常会下降代码的可读性和性能,例如一些 null 的判断逻辑、除0的控制等等;
- 2.异常的名字必须清晰并且有具体的意思,表示异常发生的问题,例如 FileNotFoundException 就很清晰直观
- 3.当方法判断出错该返回时应该抛出异常,而不是返回一些错误值,由于错误值难以理解并且不够直观,例如抛出 FileNotFoundException 异常,而不是返回 -1 或者 -2 之类的错误值。
- 4.应该捕获指定的异常,而不是 catch(Exception e) 了事,这对性能、代码的可读性以及诸多方面都有好处
- 5.Null 的判断逻辑并非一成不变的,当方法容许返回 null 的时候使用 if-else 控制逻辑,不然就抛出 NullPointerException
- 6.尽可能不要二次抛出异常,若是非得这么作的话,抛出同一个异常示例,而不是从新构建一个异常对象,这对性能是有帮助的,并且外层调用者可获取真实的异常信息
- 7.定义你本身的异常类层次,例如 UserException 和 SystemException 分别表明用户级别的异常信息和系统级别的异常信息,而其余的异常在这两个基类上进行扩展
- 8.明确的使用不一样的异常类型:
Fatal: System crash states. 架构
Error: Lack of requirement. 并发
Warn: Not an error but error probability. 分布式
Info: Info for user. 高并发
Debug: Info for developer.源码分析
- 9.不要仅仅捕获异常而不作任何处理,不便于未来维护
- 10.不要屡次重复记录同一个异常,这可让咱们清晰的了解异常发生的位置
- 11.请使用 finally 来释放一些打开的资源,例如打开的文件、数据库链接等等
- 12.大部分状况下不建议在循环中进行异常处理,应该在循环外对异常进行捕获处理
- 13.异常的粒度很重要,应该为一个基本操做定义一个 try-catch 块,不要为了简便,将几百行代码放到一个 try-catch 块中
- 14.为你的异常生成足够的文档说明,至少是 JavaDoc
- 15.为每一个异常消息定义一个数值,这对好的文档来讲是很是重要的。
大家有其余的补充吗?请不吝赐教。性能
本文的重点是你有没有收获与成长,其他的都不重要,但愿读者们能谨记这一点。同时我通过多年的收藏目前也算收集到了一套完整的学习资料,包括但不限于:分布式架构、高可扩展、高性能、高并发、Jvm性能调优、Spring,MyBatis,Nginx源码分析,Redis,ActiveMQ、、Mycat、Netty、Kafka、Mysql、Zookeeper、Tomcat、Docker、Dubbo、Nginx等多个知识点高级进阶干货,但愿对想成为架构师的朋友有必定的参考和帮助学习
须要更详细架构师技能思惟导图和如下资料的能够加一下技术交流分享群:“708 701 457”免费获取



