小课堂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相同,都往外报,但在错误发生时,故障程序是可以继续运行的。
如何做到这一点呢,有两个策略:

  1. 向后回复:将程序状态回退到处理以前,比如Oracle中的rollback方法,其缺点是需要备份之前的状态,成本比较高
  2. cleanup:通过清理逻辑恢复程序状态,这个存在开发和分析工作量,但更为通用。

等级3:在2的基础上,提供应急处理方法,确保业务能正确执行
如何做到这一点呢,有两个策略:

  1. retry:对于CF,有比较多可能在重试后解决。
  2. 向前回复:需要有备份的应急渠道和程序,这个会有比较高的开发成本,但是可以达到非常高的容错能力。

最后,还想说下,并不是所有程序都需要达到最高等级,这个需要根据程序的重要程度来进行区分,但是,至少应该能达到等级1。

小课堂Week9 例外处理设计的逆袭Part2的更多相关文章

  1. 小课堂Week10 例外处理设计的逆袭Part3

    小课堂Week10 例外处理设计的逆袭Part3 今天是<例外处理设计的逆袭>这本书阅读的第三天,也是最后一天,我们会主要通过实例,对Part2中提出的例外处理等级进行解读. Level1 ...

  2. 小课堂Week8 例外处理设计的逆袭Part1

    小课堂Week8 例外处理设计的逆袭Part1 今天和大家讲一本书,书名是<例外处理设计的逆袭>. 为什么想讲这本书,是因为,例外处理在程序代码中到处存在,但是这些到底该如何写好,总觉得有 ...

  3. Spark小课堂Week7 从Spark中一个例子看面向对象设计

    Spark小课堂Week7 从Spark中一个例子看面向对象设计 今天我们讨论了个问题,来设计一个Spark中的常用功能. 功能描述:数据源是一切处理的源头,这次要实现下加载数据源的方法load() ...

  4. Spark小课堂Week2 Hello Streaming

    Spark小课堂Week2 Hello Streaming 我们是怎么进行数据处理的? 批量方式处理 目前最常采用的是批量方式处理,指非工作时间运行,定时或者事件触发.这种方式的好处是逻辑简单,不影响 ...

  5. Spark小课堂Week1 Hello Spark

    Spark小课堂Week1 Hello Spark 看到Spark这个词,你的第一印象是什么? 这是一朵"火花",官方的定义是Spark是一个高速的.通用的.分布式计算系统!!! ...

  6. 小课堂week15 年终小结

    年终小结 一年的最后,想和大家回顾一下今年讲过的技术和书,用一些问答,一起来提炼一下精华. Spark 为什么需要分布式计算? 计算的增长速度超过了硬件的增长,单一服务器无法负荷.多服务器带来的是复杂 ...

  7. 小课堂Week12 Clean Code Part1

    小课堂Week12 Clean Code Part1 今天的主题是函数,让我们看一个函数,找一找其中的"不整洁". 我们也根据这段代码,讨论下对于整洁代码的两个重要原则. publ ...

  8. 小课堂Week11 会说话的代码

    小课堂Week11 会说话的代码 今天主要讨论下,在编码过程中和"命名"相关的问题.因为命名方法比较自由,如果要提高可读性,我们需要尽量使其符合正规的英文语法习惯. 变量/属性 通 ...

  9. Spark小课堂Week6 启动日志详解

    Spark小课堂Week6 启动日志详解 作为分布式系统,Spark程序是非常难以使用传统方法来进行调试的,所以我们主要的武器是日志,今天会对启动日志进行一下详解. 日志详解 今天主要遍历下Strea ...

随机推荐

  1. 【阿里云产品公测】云引擎ACE新手实战基于Wordpress

    [阿里云产品公测]云引擎ACE新手实战基于Wordpress 作者:阿里云用户imnpc ACE(Aliyun Cloud Engine) 是一款弹性.分布式的应用托管环境,支持Java.php多种语 ...

  2. 《MFC游戏开发》笔记十 游戏中的碰撞检测进阶:地图类型&障碍物判定

    本系列文章由七十一雾央编写,转载请注明出处. http://blog.csdn.net/u011371356/article/details/9394465 作者:七十一雾央 新浪微博:http:// ...

  3. HDU 3038 How Many Answers Are Wrong (并查集)

    How Many Answers Are Wrong Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Ja ...

  4. Android 软键盘操作

    <activity android:windowSoftInputMode=["stateUnspecified", "stateUnchanged", ...

  5. 获得自动增长的MySQL主键

    下面的脚本教您如何获得自动增长的MySQL主键,如果您对MySQL主键方面感兴趣的话,不妨一看,相信对您学习MySQL主键方面会有所启迪. import java.sql.Connection; im ...

  6. 【转】使用nmon监控suse或linux操作系统

    目的:使用nmon监控操作系统的内存,CPU等症状 nmon介绍:nmon 工具可以为AIX和Linux性能专家提供监视和分析性能数据的功能,其中包括CPU,内存,IO,free空间,页面空间页面速度 ...

  7. Linux常用命令英文全称与中文解释Linux系统

    Linux常用命令英文全称与中文解释Linux系统(转)   Linux常用命令英文全称与中文解释Linux系统 man: Manual 意思是手册,可以用这个命令查询其他命令的用法. pwd:Pri ...

  8. 每天一道LeetCode--344. Reverse String

    Write a function that takes a string as input and returns the string reversed. Example:Given s = &qu ...

  9. 三、android中Handle类的用法

    当我们在处理下载或是其他需要长时间执行的任务时,如果直接把处理函数放Activity的OnCreate或是OnStart中,会导致执行过程中整个Activity无响应,如果时间过长,程序还会挂掉.Ha ...

  10. WPF非UI线程获取修改控件属性值的方法

    public class InvokeHelper { #region delegates private delegate object MethodInvoker(Control control, ...