架构师速成6.14-开发框架-异常处理

异常为什么需要单独一节来讲解呢?因为异常是软件设计里一项需要架构者自己构思处理的一个特殊部分。一般的框架没有提供统一的处理方式,而且会被很多同学忘记处理,或者是比较粗糙处理掉。想一想有很多网站出错时,用户会看到一大段的英文异常,甚至执行的sql都包含在里面,你会不会觉得很不专业呢?

首先异常应该分类,确定异常分类至关重要,这是后期进行不同处理的基础:

  1. 业务异常,是用户在执行业务请求时,出现的业务出错或者不合法的信息,该异常的出现是合理的,应该让用户看到异常提示的信息,而且不需要记录异常日志。
  2. 权限异常,是用户在执行某些需要特殊权限的业务,或者未登录用户操作需要登录相关的业务时,出现的异常,该异常出现是合理的,不需要记录异常日志。但是处理方式是不同的。
  3. 系统异常,是出现一些不可预知的情况比如db宕机,此类异常不应该出现,出现时需要记录日志,而且此类异常需要及时报警,另外用户不应该看到具体的错误信息,此时应该提示比较优雅的错误信息,比如:网站可能正在维护中,请稍候重试,如果重试失败,请点击提交异常给相关人员,我们会及时处理。

这3类异常是所有异常的基础类,当然系统比较庞大时,针对这3类异常还需要进行细分,以进行更精细化的处理。当然我们先不再展开,先就这3类异常如何处理展开讨论。

再说一下用户请求的方式:

  1. 页面跳转
  2. ajax请求+ajax跨域请求

针对每种请求方式都会有如下4种情况:

  1. 请求正常,正常返回
  2. 请求出现业务异常,展示给用户
  3. 请求出现权限异常,要求用户登录或申请相关权限
  4. 请求出现系统异常,系统报警,给用户提示,尝试恢复

那如何进行异常的统一处理呢?

  1. 首先确认普通请求和ajax请求及ajax跨域请求,建议使用后缀进行区分json方式是ajax请求,如果是json方式而且包含callback参数的是跨域请求。
  2. 做一个统一的异常拦截器,先区分这3种方式,然后使用不同的handler来进行处理。
  3. 每个handler中,分别针对3中不同的异常,进行不同的处理逻辑。
    1. 页面跳转+业务异常,统一处理方式是跳转到统一的业务提示界面,提示用户对应的错误信息,然后在页面上可以选择返回上一页。当然也可以让用户在controller的方法上标示自定义的错误处理方式@Fail(“我希望跳转到的页面”),此时会将错误信息放入上下文,在跳转到的页面进行展示。
    2. 页面跳转+权限异常,调到登录页或权限申请页
    3. 页面跳转+系统异常,跳转到统一的错误页面,触发报警,但是不要在页面展示错误的详细信息,用户可以选择返回重试,或者 提交错误报告。
    4. ajax+业务异常,这个最简单了,直接提示错误信息就ok了。
    5. ajax+权限异常,根据不同类别进行页面跳转。
    6. ajax+系统异常,触发报警,但是不要在页面展示错误的详细信息,用户可以选择重试,或者提交错误报告
    7. 跨域只是需要增加callback,其他同ajax。
  4. 其中ajax,需要做统一的封装,针对请求的不同错误进行处理,另外发送ajax请求,如果页面刷新终止时,注意捕获ajax异常,不要提示出来了。
  5. 当然针对权限异常,我们还会再开专门的一节进行讲解。

经过这样的封装之后,开发人员只需要在需要的时候抛出异常就可以了。一个菜鸟程序员都可以轻松的抛出自己的异常,而无需关心异常背后到底发生了什么。

另外如果系统复杂度增加时,可以增加异常的子类,进行不同的异常处理。另外系统异常也可以执行自动的补偿机制,比如db宕机,尝试服务重启之类,呵呵,当然后期可以通过架构的方式尽量避免此类问题。

时间: 2024-10-13 06:03:27

架构师速成6.14-开发框架-异常处理的相关文章

架构师速成-架构体系

经过这段时间的反思和整理,终于对架构有了一个较为明确的理解.架构是产品从无到有以及慢慢壮大过程中所需要的全部技术体系总称,架构过程: 配置.编码.测试.运维.监控分析.安全.运营等一系列技术体系的选型.取舍 技术选型基础上进行规划.设计.实现.迭代.制定相关规范 相关技术及规范运用到产品开发的整个过程中,并在产品迭代过程中对架构进行迭代优化 架构不止包含技术的框架,比如有人用了spring就觉得我已经是架构师了,其实架构并不是这么简单.我们以做一个新浪微博类似产品为例,现实应该是这样的: 产品初

架构师速成6.6-知识的收集整理学习

知识如何学习前面已经讲了2节,这节主要讲知识的整理和沉淀. 其实我之前也一直没有好好的思考过这个问题,今天在整理自己的wiz知识库的时候突发灵感,所以有了这一节. 其实知识获取的过程分为搜索->收集->整理->精化->应用->分享,前一部分跟时间管理的收集也很相近吧.知识获取的思路适用于有目的的知识收集和日常的备忘性的知识收集.当然你随机收集一些资料记录下来其实效果并不是很理想,重要的是你要有目的的学习才能最大的发挥你的心智以及潜意识.当你主动要学习一项知识时,你的潜意识会主

架构师速成-架构目标之正确性

本系统架构模式: 统一异常 统一异常处理是保证程序正确性的第一步,这是第一个架构模式.具体如何实现,详见前面的文章. 日志 日志也是保证程序正确的一大手段,虽然是在错误出现后,日志才会记录.但是日志是快速确认问题,并分析出隐藏问题的重要手段. 关键点 日志文件按照级别进行区分,将错误和普通调试日志分开 日志文件滚动方式,可以按天及按大小滚动,定时清理 日志级别可以实时调整设置 性能 支撑系统: 测试系统 自动化单元测试,保证基础模块的正确性 自动化功能测试,保证每次代码更新的正确性 监控系统 监

架构师速成8.2-架构师要懂产品

产品和架构两个截然不同的职业,好像风马牛不相及,其实不是这样的.产品的思想需要经过技术的手来成为现实,在成为现实之前,需要技术理解.评估.碰撞.优化.把控.验证等等.当然架构师就承担了这一系列技术的责任,而且在一个产品的实现过程中,技术架构并不是很重要的,前期可以没有架构,简单快速验证,只有在用户多了之后,架构才有真正的用处.在初创公司,很多架构师都等不到用户多了的那一天,来实现自己的架构梦.所以产品这一关架构一定要把好,只有你把好了,后面才有机会让你去架构. 当然架构师的懂产品,是懂产品的生命

架构师速成7.3-devops为什么很重要

evops是一个很高大上的名字,其实说的简单点就是开发和运维本身就是一个团队的,要干就一起把事情干好.谁出了问题,网站都不行.作为一个架构师,必须要devops,而且要知道如何推行devops. 首先要自动化,举个阿里的例子,阿里通过aone系统来实现半自动化部署: 开发人员开发代码先自测通过后,提交代码到git. 在aone中一键部署到日常环境.部署是自动化扫描依赖冲突,系统安全等问题. 测试接到部署成功的通知,进行测试,如果测试通过,则审批通过,可以线上发布. 线上运维人员一键部署到线上,部

架构师速成8.3-架构师必须要了解的规则(转)

作为一个架构师,有些规则是必须要掌握的,这就想软件的公理,如果你学物理不知道牛顿定律,那就不要学了.在软件行业也有类似的东西,我称之为软件定律.例如: ACID,CAP,BASE ACID 传统数据库系统中,事务具有ACID 4个属性 (1)原子性(Atomicity):事务是一个原子操作单元,其对数据的修改,要么全都执行,要么全都不执行. (2)一致性(Consistent):在事务开始和完成时,数据都必须保持一致状态.这意味着所有相关的数据规则都必须应用于事务的修改,以保持数据的完整性:事务

架构师速成4.2-幼儿园要学会如何高效学习

<如何高效学习>,这本书的作者是scotthyoung,最知名是的1年内自学完成4年麻省理工学院计算机科学的33门课程,同时也写了一个学习方法的Blog,他使用费曼技巧来加强理解和学习. 费曼技巧有很多种理解,最简单的是: 拿张白纸; 在白纸顶部写上你想理解的某想法或某过程: 用你自己的话解释它,就像你在教给别人这个想法. 最要紧的是,对一个想法分而化之,虽然可能重复解释某些已经弄懂的知识点.但你最终会到达一个临界点,无法再解释清楚.那里正是你需要填补的知识缺口.为了填补这个缺口,你可以查课本

架构师速成5-小学

很高兴你很快的进入了小学,小学的东西会让你更加的耀眼. 阶段: 小学 学时:2-3个月 升学标准 能自己制定目标及计划,get thing done. 可以轻松制作一个让你身旁人惊叹的ppt 能做一个简单的网站(或者客户端软件),数据能保存到数据库. 实践经验干货来了. 先说ppt吧,这个上一期已经讲了,如果你ppt做到出神入化,基本不需要做架构这么苦逼的事情了.因为你很容易成为老板的心腹,军师,走上人生正道.作为一个苦逼的小学程序员,很羡慕吧.那就再努力学一下,不用多久,你就会升职加薪,当上总

架构师速成7.4-架构师为什么要带团队

有人说架构师明明只需要做架构,干嘛要扯出来带团队,带团队不是项目经理或者CTO之类的管理人员干的事情吗? 其实这个是一个误区,架构师其实是一个全栈的特殊人物,应该项目开发的所有的环节和角色都有深入了解,尤其是带过团队对你的帮助会更大.那种只做架构,而且仅会做架构的架构师,是大公司畸形的产物,在我看来,不太接地气.大公司人员体系庞大,分工明确而且细致,技术只是负责技术就好了,管理自然有专门的管理人员来做.我简单列举一下架构师带团队的优势: 架构设计时会从整个项目的角度考虑 开发人员使用更方便 测试

架构师速成4.4-我该学什么语言

该学什么语言好呢?很多人都很纠结,其实我建议学习java,为什么呢?文档多,上手容易,教程也多. 当然一开始最好学这样的语言,但随着你知识的增长,我的建议是能学多少学多少,但是有几个是必须的,如下: 前端html,js,css sql 至少会一门脚本语言,python,ruby等等 shell 至少会一门后端语言,类似java,scala是个不错的选择 语言学的越多越好,你可以总结各个的优缺点,另外最后你发现语言都是想通的,学一门新语言很容易. 当然上面的语言是为了你做架构师准备的,如果你说我想