小课堂Week8

例外处理设计的逆袭Part1

今天和大家讲一本书,书名是《例外处理设计的逆袭》。
为什么想讲这本书,是因为,例外处理在程序代码中到处存在,但是这些到底该如何写好,总觉得有些懵懵懂懂。正好听到Jackson老师的推荐,读到了这本书,如获甘霖,好东西和大家分享。

什么是例外处理

这本书的作者是一位台湾的大牛叫Teddy Chen。台版和港版的书有一个比较好的习惯,就是对于英文的技术词汇,解释但不翻译,因为中文和英文在某些词汇的描述上强度是不同的,直译往往会丢失一部分的含义,所以先来界定几个词汇。

  • Exception:这个就是书名中指的例外,我们一般也可以称其为异常。
  • Fault、Error、Failure:
    这三个词是exception的三个生命周期:
    fault指的系统的缺陷,是一种内在的东西,比如bug。
    error指的的一种表现出来的错误状态,比如异常的提示,fault是error发生的原因。
    failure指的是系统服务的异常,比如宕机,会产生业务影响。

为什么要理清这三个概念呢,结合下工作:
作为程序员,我们收到的往往都是failure的信息,而要解决问题,我们往往需要打交道的是fault,大家发现了没有,这个中间是一段空白地带的,而这个就是例外处理研究的方向。

所以,我们所谈的例外处理,指的是:

  1. 如何通过failure,快速找到fault。
  2. 更进一步,在发生fault的情况下,如何避免不发生failure。

fault的分类

我们先从fault开始,根据美国一些大神的研究,fault依据产生原因,可以区分为两个类:

  • design fault
    一般我们称为bug,这是人为造成的问题,如果不修改代码,不会自动消失。
    有一个观点很重要,就是我们会认为,design fault是一种不可预测的错误。原因是这样的,这个就有点像我们做考卷,其实每个人都是向着做对的方向来做的,但事实上,里面会有很多的错误,这个站在做题者的角度是无法预知的,和知识水平有关,因为能预知的话,他就不会做错。所以,对于那种故意做错题的情况,请大家不要犯,这个也不在我们讨论范围内。

  • component fault
    由于环境影响或者其他客观因素造成的问题,比如内存溢出。这种问题,有可能是暂时的、甚至是偶发的。有一个重要的观点是,我们认为,这种问题是可预测的。

在Java中,就将异常分为了两类,CheckedException和UnCheckedException。
其中,CheckedException在语法层面会强制要求处理,比如SQLException、IOException等。
UnCheckedException在语法层面不会强制要求处理,比如各种RunTimeException。
这个是符合对两种fault定义的,CheckedException用来处理component fault,UnCheckedException用来处理design fault。

try-catch-finally的职责分担

Try-catch-finally是我们通常用来进行例外处理的语法结构。这个说明下三个模块的定位。

  • Try
    在try模块中,会对逻辑进行执行,所以在try模块中,最重要的职责是识别并报出Error。

  • Catch
    因为所有的例外都会集中到Catch模块中处理,Catch的职责主要有两点:
  1. 处理Error,可以采用回滚、重试等方式,直接把Error消灭掉。
  2. 如果无法处理,则上报给上级模块来进行处理。
  • Finnaly
    这是Java等语言中提供的辅助性语法结构,可以比较方便的解决资源回收清理的问题。这个和例外处理是无关的。
    进行资源回收清理时,也是有可能出现异常,但是,对于Java语言来说,一个程序一次只能抛出一个异常,回收的异常会覆盖掉try逻辑中的异常,而且这个是默认的逻辑!!!
    所以,在这里,推荐采用两害相权取其轻的原则,将清理异常屏蔽掉,优先将try逻辑中的异常给抛出来。另外,也可以使用Supressed Exception,将异常进行组装后抛出。

小结

今天主要都是在提出问题,目标是明确关注点,在后续会继续深入一些具体的问题,介绍下书中提出的实践和方法。

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

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

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

  2. 小课堂Week9 例外处理设计的逆袭Part2

    小课堂Week9 例外处理设计的逆袭Part2 今天继续阅读<例外处理设计的逆袭>这本书,我们先看两个案例: 案例1 问:如果要设计一个依据学号到数据库中查询学生资料的函数,当找不到符合条 ...

  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. vim中光标的前进和后退

    流行的文本编辑器通常都有前进和后退功能,可以在文件中曾经浏览过的位置之间来回移动.在 vim 中使用 Ctrl-O 执行后退,使用 Ctrl-I 执行前进.相关帮助: :help CTRL-O  :h ...

  2. SQL Server 通配符 Wildcard character

    SQL Server 通配符 Wildcard character %        任意长度的字符串,如:'%computer%' _        单个字符,如:'_ean' []        ...

  3. mount: can't find cdrom in /etc /fstab or /etc/mtab

    我用的linux操作系统类别是CentOS-6.5 首先在虚拟机选项的设置里设置CD/DVD选项其中勾选Connect at power on选项 在连接中选择Use ISO image file:即 ...

  4. Linux 下安装配置nginx及常见问题解答

    其实也不能完全算是原创吧!都是我配置nginx时所遇到的问题,查阅资料后总结起来.即是巩固一下nginx的配置,也是分享给新入Linux的童鞋们一些知识 好了,不多废话,进入主题吧! 为nginx添加 ...

  5. hdu 4374 单调队列优化动态规划

    思路:我只想说,while(head<=rear&&que[rear].val+sum[j]-sum[que[rear].pos-1]<=dp[i-1][j]+num[i- ...

  6. hdu 4606 简单计算几何+floyd+最小路径覆盖

    思路:将所有的直线的两个端点和城市混在一起,将能直接到达的两个点连线,求一次floyd最短路径.二分枚举bag容量,然后按给的要先后占领的城市由前向后,把能到一步到达的建一条边.然后求一次最小路径覆盖 ...

  7. Repeater控件中的LinkButton(转)

    LinkButton小用法: 1.在使用时可以通过CommandName和CommandArgument属性联合起来绑定并传值,如:CommandName="record"Comm ...

  8. Apache ab 测试工具使用(一)

    简述: 试用apache ab测试工具 下载点 http://httpd.apache.org/download.cgi 参考: http://jingyan.baidu.com/article/e3 ...

  9. Redis - 发布/订阅模式

    Redis 提供了一组命令可以让开发者实现 “发布/订阅” 模式.“发布/订阅” 可以实现进程间的消息传递,其原理是这样的: “发布/订阅” 模式中包含两种角色,分别是发布者和订阅者.订阅者可以订阅一 ...

  10. Android重力感应开发

    http://blog.csdn.net/mad1989/article/details/20848181 一.手机中常用的传感器 在Android2.3 gingerbread系统中,google提 ...