小课堂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适配器模式随笔记
今天学习了一下java中的适配器模式,在这里做个记录,方便以后查看 什么是适配器,适配就是连接源到目标的中间件,简单的例子就是我们的港水货手机充电器是大三角,我们想要在大陆正常使用我们需要一个转接充电 ...
- [xUI] ligerUI开发框架简介和搭建
ligerUI开发者:谢略,网名daomi API: http://api.ligerui.com/ 演示地址: http://demo.ligerui.com/ 源码下载: ht ...
- 管理后台-第一部分:Creating custom sections in Umbraco 7 - Part 1(翻译文档)
在Umbraco上每个部分都可以被称为一个应用程序,所以这些部分和应用程序基本上是一样的.我们首先要做的事情是需要创建应用程序.在这个例子中,我不会去摆弄xml文件或是数据库——我将使用类来创建我的内 ...
- hdu 3234 并查集
虚拟一个根节点n,设其值为0.并且始终保持其为根. #include<map> #include<set> #include<cmath> #include< ...
- noi 97 积木游戏
思路:黑书的例题 #include<map> #include<set> #include<cmath> #include<queue> #includ ...
- Oracle数据库作业-3 查询
1. 查询Student表中的所有记录的Sname.Ssex和Class列.
- 发现个div float的小秘密
浮动时宽度塌缩了不再是父元素100%.
- jquery实现多行文字图片滚动效果
今儿分享一个jquery实现多行滚动效果. 我看一些论坛网站上面,公告处用的较多. 代码如下 复制代码 // 多行滚动(function($){$.fn.extend({Scroll:function ...
- web.config connectionStrings 数据库连接字符串的解释
先来看一下默认的连接SQL Server数据库配置<connectionStrings> <add name="LocalSqlServer" connect ...
- C#创建Windows服务入门图解(VS2010)
C#创建Windows服务入门图解(VS2010) Windows服务大家都知道,比如Audio.Theme都是大家比较熟悉的服务,他们可以设为自动启动的,并且在注册表的开机自启动项里是没有痕迹的.所 ...