小课堂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. 安卓AlertDialog的使用

    AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this); builder.setMessage("数 ...

  2. sed程序

    程序1: 实现简单的shell sed替换功能 程序2:修改haproxy配置文件  1.查 输入:www.oldboy.org 获取当前backend下的所有记录 2.新建 输入: arg = { ...

  3. font拓展字体

    最近接触了一个将字体拓展的方法,感觉很不错,所以积累一下. 最近接触的项目一直再用antd,它本身已经提供了很多图标,但是依然不够用,所以需要我们拓展出来一些. 当我们下载到本地之后,就会有几个文件, ...

  4. 仿UC浏览器图片加载进度条

    前几天用UC浏览器看新闻(无意中给UC打了广告),看到它的图片加载进度条,正好最近有时间,所以就自己写了一个. 效果图如下 进度条的底色和填充颜色都可以调整. 首先中间的笑脸作为一个整体,其实现代码如 ...

  5. hibernate 创建session

    //1. 创建一个 SessionFactory 对象 SessionFactory sessionFactory = null; //1). 创建 Configuration 对象: 对应 hibe ...

  6. 关于JAVA那点事---i++和++i

    对i++和++i 一直有点晕,今天专门抽空来研究相关的知识. 先从简单的说起. 有如下程序: int i=0; i=i++; system.out.print(i); 一眼望去这个结果显而易见是1,但 ...

  7. ip 子网掩码 网关 DNS

    这一篇文章也很好: 原文引用于:  http://www.cnblogs.com/jiqing9006/p/3365939.html 内外网ip: IP地址: IPv4地址分为A.B.C.D.E五类, ...

  8. 【解决】该任务映像已损坏或已篡改。(异常来自HRESULT:0x80041321)

    把系统升级到Windows 10,体验了一番Windows 10.感觉不怎么好用退回到了Windows 7,发现我原来自定义的任务计划没有按时执行,于是打开任务计划,弹出了下面的对话框[该任务映像已损 ...

  9. 今天学习css一些动画效果

    <!doctype html><html lang="en"> <head> <meta charset="UTF-8" ...

  10. 你所不知道的z-index的用法

    在开始今天的内容之前,先让我们来看下面一段代码: <style type="text/css"> #div1,#div2{ width:200px; height:20 ...