关于应用的全局统一异常处理

来源:互联网 发布:基站数据库下载 编辑:程序博客网 时间:2024/06/08 07:13

关于应用的全局统一异常处理

在开发过程中,我们习惯于根据类的职能将其划分到不同的层,例如Controller层、Service层、DAO层…这有利于我们理解系统的层次结构。同时,每一层专注于各自的工作,也有利于各个层之间的解耦。

然而,异常处理在各个层中都可能会发生,我们应该如何处理错误?

常见的方案有两个:
1. 在抛出异常处添加一个try/catch块,在抛出处立即处理。
2. 逐层上抛,一直抛到最终由一个统一的、专门负责异常处理的地方处理。

我们先来看看第一种处理方案:这种方案确实处理了异常,但却在代码中添加了处理异常的逻辑代码,这些代码和我们关注的业务关系不大,同时,在很多地方中写入了异常处理代码,导致了业务逻辑混乱,系统的代码耦合度高,工作量大且不好统一,维护的工作量也很大。

显然,第一种方法是不推荐的。我们应该更推崇使用第二种处理方案。

在第二种方案中,我们只需要从底向上地抛异常即可,最终由统一的异常处理器根据异常种类以及异常信息做出相应的处理。

举个简单例子:我们假设用户注册的数据我们前后端都没有检验,当然,实际开发中肯定会有校验的。用户传给后台一个长度为20的账号,但我们的数据库设置账号长度限制最多10个字符,是无法插入的。所以在调用注册的DAO方法时会抛出异常,我们只需要将异常信息上抛给调用DAO方法的Service,再由Service上抛给Controller,Controller上抛给统一异常处理器,统一处理器捕获到异常后处理异常,告诉用户账号不能过长。如此在我们的业务代码中,就不会耦合很多与主要业务逻辑无关的try/catch代码,开发维护也比较方便。

并且,在第二种方法中,我们不仅能对已有定义的异常进行处理,还可以自定义异常,在统一异常处理器中,针对我们自定义的异常做出特定的处理。

原创粉丝点击