小课堂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. HTML 之 Web页面表单form中只有一个input的text元素,按回车默认提交

    WEB开发中,如果页面的 form 中只有一个input元素,在该input元素的输入框中按回车(注:此时并没有写对应的onkeydown等事件处理),则浏览器会默认提交表单,请看如下代码: < ...

  2. Java设计模式15:常用设计模式之享元模式(结构型模式)

    1. Java之享元模式(Flyweight Pattern) (1)概述:       享元模式是对象池的一种实现,英文名为"Flyweight",代表轻量级的意思.享元模式用来 ...

  3. hdu 4670 树的点分治

    思路:首先当然是要用树的点分治了.根节点为root,那么经过root的合法路径数求出来这题就解决了.因为我们可以用分治枚举根,最后将所有根的路径数加起来就是结果.当然这里的根不是整棵树的根,是子树根. ...

  4. jQuery点击图片弹出大图遮罩层

    使用jQuery插件HoverTreeShow弹出遮罩层显示大图 效果体验:http://hovertree.com/texiao/hovertreeshow/ 在开发HoverTreeTop项目的产 ...

  5. Mac环境下svn的使用(转载)

    在Windows环境中,我们一般使用TortoiseSVN来搭建svn环境.在Mac环境下,由于Mac自带了svn的服务器端和客户端功能,所以我们可以在不装任何第三方软件的前提下使用svn功能,不过还 ...

  6. C#中thrift 中THttpHandler 传输数据 慢 slow 解决办法

    1. 在用c# 写thrift的服务端,来相应http请求,在用结构体传输时,会遇到一个问题,就是(在用网络)传输数据特别慢, 这是由于在发生数据是用的TStreamTransport 导致每传一个数 ...

  7. Android代码内存优化建议-OnTrimMemory优化

    原文  http://androidperformance.com/2015/07/20/Android代码内存优化建议-OnTrimMemory优化/ OnTrimMemory 回调是 Androi ...

  8. sqlsever 关于索引

    索引: 在sqlserver中,存储的单位最小是页,页是不可再分的B树:初衷是减少对磁盘的扫描次数,如果一个表或者索引没有使用B树(对于没有聚集索引的表是使用 Heap 堆进行存储的),那么查找一个数 ...

  9. Jquery插件的编写和使用

    第七章 Jquery插件的编写和使用    插件的定义: 插件也称为扩展,是一种遵循一定规范的应用程序接口编写出来的程序. 下面是Jquery插件的编写很使用:要查看请点击:Jquery插件的编写很使 ...

  10. 断开SVN连接操作方法

    SVN是日常项目管理中经常使用到的工具,然而拷贝备份需要与SVN服务器断开连接,具体操作步骤: 1.在桌面建立一个文本文件,取名为kill-svn-folders.reg(扩展名由txt改为reg), ...