对于一个大的项目,最怕两件事情:
1. 系统出现问题我们不知道,等到问题慢慢变大,用户开始投诉后才知道“哦,我们系统出现问题了呀!”。 多么可怕!!!
2. 系统出了问题,但是就是找不出来哪里出现了问题。
对于第一个问题,如果出现,后果非常的严重。 因此,为了尽量避免这样的问题,我们需要在异常处理方面尽最大的力量做到更好!
下面,我先将一段在项目中用到的一段代码贴出来:
我们很多人看到这段代码,会认为这段代码没有什么问题(正常运行情况下,这段代码也不会出现问题)。 但是,如果问题真的在这段代码中出现,开发人员很难知道出现了问题。如果是这种情况,那么问题就大了,就等着用户来投诉吧!!
主要有以下的原因:
1. 丢掉了异常。 异常信息就算打印到了堆栈,也不会有人看到!除非问题出现,有用户投诉时,你才发现出现了问题,开始去查找日志!所以,好像看起来很严谨的代码,其实作用并不大。
2. 异常处理再加上框2中的空判断。完美的避开了所有的正确答案。本来需要更新文档,结果什么错误也没有报,什么也没有做。
所以————对于开发人员: 绝大部分场景,不允许捕获异常,不要乱加空判断!只有明显不需要关心的异常,如关闭资源的时候的IO异常,可以捕获,然后什么都不干。其他的时候,不允许捕获异常,都抛出去,到controller层由AOP去处理。 对于空判断大部分是不需要的,你如果写了空判断,必须要测试为空和不为空二种场景,要么就不要写空判断。
新手最容易犯的错误: 到处捕获异常,到处加空判断,自以为写出了“健壮”的代码,实际上完全相反。
比如,某一天你在一个团队中负责一部分功能代码。最后提交代码时发现一般代码是 try-catch 和空判断,给人的感觉就是 “ 垃圾 ”。 另一方面,这样做会掩盖很多的错误。
所以,上面的代码可以这样修改(异常向上抛给controller层的AOP处理)
对于异常的定义我在这里就不介绍了(本博文主要是讲一下规范)。
总结:
- 异常由专门的开发人员负责开发,在开发之前实现定义好异常类
- 不允许开发人员捕获异常
- 后台异常(如队列等)异常一定要有异常通知机制,要第一时间知道异常
- 少加空判断,加了空判断就要为测试为空和非空的场景。