异常为什么需要单独一节来讲解呢?因为异常是软件设计里一项需要架构者自己构思处理的一个特殊部分。一般的框架没有提供统一的处理方式,而且会被很多同学忘记处理,或者是比较粗糙处理掉。想一想有很多网站出错时,用户会看到一大段的英文异常,甚至执行的sql都包含在里面,你会不会觉得很不专业呢?
首先异常应该分类,确定异常分类至关重要,这是后期进行不同处理的基础:
- 业务异常,是用户在执行业务请求时,出现的业务出错或者不合法的信息,该异常的出现是合理的,应该让用户看到异常提示的信息,而且不需要记录异常日志。
- 权限异常,是用户在执行某些需要特殊权限的业务,或者未登录用户操作需要登录相关的业务时,出现的异常,该异常出现是合理的,不需要记录异常日志。但是处理方式是不同的。
- 系统异常,是出现一些不可预知的情况比如db宕机,此类异常不应该出现,出现时需要记录日志,而且此类异常需要及时报警,另外用户不应该看到具体的错误信息,此时应该提示比较优雅的错误信息,比如:网站可能正在维护中,请稍候重试,如果重试失败,请点击提交异常给相关人员,我们会及时处理。
这3类异常是所有异常的基础类,当然系统比较庞大时,针对这3类异常还需要进行细分,以进行更精细化的处理。当然我们先不再展开,先就这3类异常如何处理展开讨论。
再说一下用户请求的方式:
- 页面跳转
- ajax请求+ajax跨域请求
针对每种请求方式都会有如下4种情况:
- 请求正常,正常返回
- 请求出现业务异常,展示给用户
- 请求出现权限异常,要求用户登录或申请相关权限
- 请求出现系统异常,系统报警,给用户提示,尝试恢复
那如何进行异常的统一处理呢?
- 首先确认普通请求和ajax请求及ajax跨域请求,建议使用后缀进行区分json方式是ajax请求,如果是json方式而且包含callback参数的是跨域请求。
- 做一个统一的异常拦截器,先区分这3种方式,然后使用不同的handler来进行处理。
- 每个handler中,分别针对3中不同的异常,进行不同的处理逻辑。
- 页面跳转+业务异常,统一处理方式是跳转到统一的业务提示界面,提示用户对应的错误信息,然后在页面上可以选择返回上一页。当然也可以让用户在controller的方法上标示自定义的错误处理方式@Fail(“我希望跳转到的页面”),此时会将错误信息放入上下文,在跳转到的页面进行展示。
- 页面跳转+权限异常,调到登录页或权限申请页
- 页面跳转+系统异常,跳转到统一的错误页面,触发报警,但是不要在页面展示错误的详细信息,用户可以选择返回重试,或者 提交错误报告。
- ajax+业务异常,这个最简单了,直接提示错误信息就ok了。
- ajax+权限异常,根据不同类别进行页面跳转。
- ajax+系统异常,触发报警,但是不要在页面展示错误的详细信息,用户可以选择重试,或者提交错误报告
- 跨域只是需要增加callback,其他同ajax。
- 其中ajax,需要做统一的封装,针对请求的不同错误进行处理,另外发送ajax请求,如果页面刷新终止时,注意捕获ajax异常,不要提示出来了。
- 当然针对权限异常,我们还会再开专门的一节进行讲解。
经过这样的封装之后,开发人员只需要在需要的时候抛出异常就可以了。一个菜鸟程序员都可以轻松的抛出自己的异常,而无需关心异常背后到底发生了什么。
另外如果系统复杂度增加时,可以增加异常的子类,进行不同的异常处理。另外系统异常也可以执行自动的补偿机制,比如db宕机,尝试服务重启之类,呵呵,当然后期可以通过架构的方式尽量避免此类问题。
时间: 2024-10-13 06:03:27