小课堂Week9 例外处理设计的逆袭Part2
小课堂Week9
例外处理设计的逆袭Part2
今天继续阅读《例外处理设计的逆袭》这本书,我们先看两个案例:
案例1
问:如果要设计一个依据学号到数据库中查询学生资料的函数,当找不到符合条件的学习资料时候,是不是要丢出异常?
分析:
根据Part1中的介绍,例外的生命周期包括fault、error、failure,那么要抛出的首先应该是一个fault。
让我们看下案例中的这个场景属于哪类fault。
首先,这个不是component fault,因为与环境无关。
找不到资料,看起来是主观引入的,那是不是一个design fault,我们之前也讲过,design fault应该是不可预期的,但是这个找不到资料明显是可预期的,所以也不是design fault。
综上所述,找不到资料不是一个fault,所以也不是一个异常,不应该抛出。
那问题又来了,如果不抛出异常,那应该返回什么呢?默认情况下,应该是返回null,但是我们知道null带来的后遗症会很多,所以建议的是返回一个Null Object,比如Java8中的Optional,Scala中的None对象等都能解决这个问题。
案例2
问:考虑一个三层体系的系统,包括了用户界面App,业务处理GameServer和底层通讯Acceptor。
Layer1:App
Layer2:GameServer
Layer3:Acceptor
如果Acceptor收到一个IOException要如何处理。
分析:
首先,异常适不适合在App端处理,这个是否定的,因为IOException是一个比较偏技术的异常,如果直接反馈给用户,其实并不友好,用户也无法处理。另外,从异常的生命周期看,反馈给用户的话,相当于把error变成了failure,这种情况应该尽量的减少。
其次,是不是适合在Acceptor中处理,大多数情况下不适合,应该acceptor作为一个底层组件,其职责比较单一,所掌握的信息也是不够全面的,异常处理界有一句话叫:能力越大,责任越大。Acceptor往往是能力不够。
所以,比较适合在GameServer中将异常处理掉,由于其中信息作为全面,我们可以有多种的处理思路和方法。
异常处理强度等级
这个部分应该是整本书的精化,通过对于强度等级的实施,可以把异常处理的理念在工程上实施出来。
等级0:不管例外
等级1:error-reporting,立即中止运行 ,所有例外都往外抛,全部报告给使用者,或者开发者使用
解读:等级1要求比较低,实质上就是把所有的error都转成了failure,但是当中的重点是往外抛这个概念,也就是异常信息在最外层才被记录,因为异常有传递体系,越外层信息会越全,只有越全面的信息才越有用。
等级2:和1相同,都往外报,但在错误发生时,故障程序是可以继续运行的。
如何做到这一点呢,有两个策略:
- 向后回复:将程序状态回退到处理以前,比如Oracle中的rollback方法,其缺点是需要备份之前的状态,成本比较高
- cleanup:通过清理逻辑恢复程序状态,这个存在开发和分析工作量,但更为通用。
等级3:在2的基础上,提供应急处理方法,确保业务能正确执行
如何做到这一点呢,有两个策略:
- retry:对于CF,有比较多可能在重试后解决。
- 向前回复:需要有备份的应急渠道和程序,这个会有比较高的开发成本,但是可以达到非常高的容错能力。
最后,还想说下,并不是所有程序都需要达到最高等级,这个需要根据程序的重要程度来进行区分,但是,至少应该能达到等级1。
小课堂Week9 例外处理设计的逆袭Part2的更多相关文章
- 小课堂Week10 例外处理设计的逆袭Part3
小课堂Week10 例外处理设计的逆袭Part3 今天是<例外处理设计的逆袭>这本书阅读的第三天,也是最后一天,我们会主要通过实例,对Part2中提出的例外处理等级进行解读. Level1 ...
- 小课堂Week8 例外处理设计的逆袭Part1
小课堂Week8 例外处理设计的逆袭Part1 今天和大家讲一本书,书名是<例外处理设计的逆袭>. 为什么想讲这本书,是因为,例外处理在程序代码中到处存在,但是这些到底该如何写好,总觉得有 ...
- Spark小课堂Week7 从Spark中一个例子看面向对象设计
Spark小课堂Week7 从Spark中一个例子看面向对象设计 今天我们讨论了个问题,来设计一个Spark中的常用功能. 功能描述:数据源是一切处理的源头,这次要实现下加载数据源的方法load() ...
- Spark小课堂Week2 Hello Streaming
Spark小课堂Week2 Hello Streaming 我们是怎么进行数据处理的? 批量方式处理 目前最常采用的是批量方式处理,指非工作时间运行,定时或者事件触发.这种方式的好处是逻辑简单,不影响 ...
- Spark小课堂Week1 Hello Spark
Spark小课堂Week1 Hello Spark 看到Spark这个词,你的第一印象是什么? 这是一朵"火花",官方的定义是Spark是一个高速的.通用的.分布式计算系统!!! ...
- 小课堂week15 年终小结
年终小结 一年的最后,想和大家回顾一下今年讲过的技术和书,用一些问答,一起来提炼一下精华. Spark 为什么需要分布式计算? 计算的增长速度超过了硬件的增长,单一服务器无法负荷.多服务器带来的是复杂 ...
- 小课堂Week12 Clean Code Part1
小课堂Week12 Clean Code Part1 今天的主题是函数,让我们看一个函数,找一找其中的"不整洁". 我们也根据这段代码,讨论下对于整洁代码的两个重要原则. publ ...
- 小课堂Week11 会说话的代码
小课堂Week11 会说话的代码 今天主要讨论下,在编码过程中和"命名"相关的问题.因为命名方法比较自由,如果要提高可读性,我们需要尽量使其符合正规的英文语法习惯. 变量/属性 通 ...
- Spark小课堂Week6 启动日志详解
Spark小课堂Week6 启动日志详解 作为分布式系统,Spark程序是非常难以使用传统方法来进行调试的,所以我们主要的武器是日志,今天会对启动日志进行一下详解. 日志详解 今天主要遍历下Strea ...
随机推荐
- [Java] HashMap的用法
重点介绍HashMap.首先介绍一下什么是Map.在数组中我们是通过数组下标来对其内容索引的,而在Map中我们通过对象来对对象进行索引,用来索引的对象叫做key,其对应的对象叫做value.在下文中会 ...
- 搭建本地Git服务器6步走
1. 在服务器上安装git和ssh 2. 在服务器上新建一个用户,比如就叫git sudo adduser git 3. 在服务器上新建一个目录来放置git仓库 mkdir gitrepo git i ...
- C#中XML与对象之间的序列化、反序列化
直接上代码: using System; using System.IO; using System.Text; using System.Xml; using System.Xml.Serializ ...
- dfa最小化,修正了上个版本的一些错误。
上个版本测试的时候,只用了两个非常简单的测试用例,所以好多情况有问题却没有测试出来 bug1:在生成diff_matrix的时候,循环变量少循环了一次,导致最后一个节点在如果无法与其他点合并的情况下, ...
- poj 3034 动态规划
思路:这是一道坑爹的动态规划,思路很容易想到,就是细节. 用dp[t][i][j],表示在第t时间,锤子停在(i,j)位置能获得的最大数量.那么只要找到一个点转移到(i,j)收益最大即可. #incl ...
- 手机app(功能)测试重点
在手机客户端进行查看的测试重点:1.“点击加载更多”的分页处理技术,是否有重复的数据,数据显示是否完整,到达最后一页后是否还有数据进行显示2.数据的排序方式2.界面跳转是否正确3.出现异常情况是否有提 ...
- VS2012添加ADO实体数据模型
最近更新了开发工具为VS2012,在使用EntityFramework创建实体数据模型的时候,在添加选项中找不到这个选项. 确定了自己已经安装了EntityFramework,猜到估计是版本的问题,于 ...
- ASP.NET 状态的传递和保存
1,HTTP协议是无状态的.服务器不会记住上次给浏览器的处理结果,如果需要上次处理结果(上次状态)就需要浏览器把处理结果值(上次状态)再次给服务器. 2,URL传值:通过URL参数或者通过Form表单 ...
- 【CSS3】---background-origin background-clip background-size
background-origin 设置元素背景图片的原始起始位置. 语法: background-origin : border-box | padding-box | content-box; 参 ...
- Part 9 Union and union all in sql server
Union and union all in sql server