项目中异常的几个注意事项

一个常见的错误


项目中异常的几个注意事项

大致含义:spring的事务回滚有问题
问题根源:代码中出现了被吞的异常,就是try catch掉,只在catch中打了一行日志,甚至有人是直接e.printstacktrace,根本在日志中都不会看到。哪怕打了日志,程序也会继续执行下去,在最上层的方法结束的时候,由于加了事务注解,spring检测到了异常,但是try-catch是一个脱离了spring管理的方式,如果其中没有对异常做显示处理(如抛出或者手动回滚等),那么就会发生冲突,报这个错。
解决办法:在相关代码中寻找try-catch的地方,可以调试下是哪里出问题或者看看哪些try-catch没有对异常做处理,然后对异常做处理即可。

异常的分类


项目中异常的几个注意事项

errorexception的区别
error:OutOfMemoryError 内存溢出,需要终止程序的异常

checkedunchecked 的区别
checked:受检式异常,需要被人工处理,如SQLException、ClassNotFoundException
unchecked:非受检式异常,继承自runtimeException,是指运行时程序可能会发生的异常,不需要开发接入

unchecked的分类
可预测异常:IndexOutOtBoundsException、NullPointerException
需捕获异常:DubboTimeoutException
可透出异常:NoSuchRequestHa ndlingMethodException,即404等,spring会自动处理

抛异常


抛异常的原则
最好使用和业务场景对应的自定义异常,不能直接抛出RuntimeException、Exception等。
内部应用直接抛异常对象,跨应用如接口等则选择封装错误码和错误信息。
对于NPE之类的异常,防御式编程理念大于契约式编程理念,因为众多因素导致契约不是那么可靠的,比如网络中断等,所以调用方需要做判断。

try-catch-finally代码块


try:可能会发生错误的代码块
catch:异常处理
finally:资源释放(一定会执行)
注意以下几点:
不在finally中写return
如果try中使用了相关资源,finally中一定要释放,如Lock、ThreadLocal、InputStream
try中使用资源的时候,写在最上方
catch中禁止对异常只打印一行日志等操作