小课堂Week8 例外处理设计的逆袭Part1
小课堂Week8
例外处理设计的逆袭Part1
今天和大家讲一本书,书名是《例外处理设计的逆袭》。
为什么想讲这本书,是因为,例外处理在程序代码中到处存在,但是这些到底该如何写好,总觉得有些懵懵懂懂。正好听到Jackson老师的推荐,读到了这本书,如获甘霖,好东西和大家分享。
什么是例外处理
这本书的作者是一位台湾的大牛叫Teddy Chen。台版和港版的书有一个比较好的习惯,就是对于英文的技术词汇,解释但不翻译,因为中文和英文在某些词汇的描述上强度是不同的,直译往往会丢失一部分的含义,所以先来界定几个词汇。
- Exception:这个就是书名中指的例外,我们一般也可以称其为异常。
- Fault、Error、Failure:
这三个词是exception的三个生命周期:
fault指的系统的缺陷,是一种内在的东西,比如bug。
error指的的一种表现出来的错误状态,比如异常的提示,fault是error发生的原因。
failure指的是系统服务的异常,比如宕机,会产生业务影响。
为什么要理清这三个概念呢,结合下工作:
作为程序员,我们收到的往往都是failure的信息,而要解决问题,我们往往需要打交道的是fault,大家发现了没有,这个中间是一段空白地带的,而这个就是例外处理研究的方向。
所以,我们所谈的例外处理,指的是:
- 如何通过failure,快速找到fault。
- 更进一步,在发生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的职责主要有两点:
- 处理Error,可以采用回滚、重试等方式,直接把Error消灭掉。
- 如果无法处理,则上报给上级模块来进行处理。
- Finnaly
这是Java等语言中提供的辅助性语法结构,可以比较方便的解决资源回收清理的问题。这个和例外处理是无关的。
进行资源回收清理时,也是有可能出现异常,但是,对于Java语言来说,一个程序一次只能抛出一个异常,回收的异常会覆盖掉try逻辑中的异常,而且这个是默认的逻辑!!!
所以,在这里,推荐采用两害相权取其轻的原则,将清理异常屏蔽掉,优先将try逻辑中的异常给抛出来。另外,也可以使用Supressed Exception,将异常进行组装后抛出。
小结
今天主要都是在提出问题,目标是明确关注点,在后续会继续深入一些具体的问题,介绍下书中提出的实践和方法。
小课堂Week8 例外处理设计的逆袭Part1的更多相关文章
- 小课堂Week10 例外处理设计的逆袭Part3
小课堂Week10 例外处理设计的逆袭Part3 今天是<例外处理设计的逆袭>这本书阅读的第三天,也是最后一天,我们会主要通过实例,对Part2中提出的例外处理等级进行解读. Level1 ...
- 小课堂Week9 例外处理设计的逆袭Part2
小课堂Week9 例外处理设计的逆袭Part2 今天继续阅读<例外处理设计的逆袭>这本书,我们先看两个案例: 案例1 问:如果要设计一个依据学号到数据库中查询学生资料的函数,当找不到符合条 ...
- 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 ...
随机推荐
- Invalidate、RedrawWindow与UpdateWindow
Invalidate.RedrawWindow与UpdateWindow的区别 Invalidate()是强制系统进行重画,但是不一定就马上进行重画.因为Invalidate()只是通知系统,此 时的 ...
- MongoDB,HDFS, Spark to 电影推荐
http://www.infoq.com/cn/news/2014/12/mongdb-spark-movie-recommend MovieWeb是一个电影相关的网站,它提供的功能包括搜索电影信息. ...
- Mysql 复习
1.my.ini :mysql 配置文件 [client]#password = your_passwordport = 3306socket = /tmp/mysq ...
- Ubuntu下用SecureCRT连接串口/dev/ttyUSB0权限修复
在普通用户的模式下,用SecureCRT链接串口交换机,开始会提示/dev/ttyUSB0权限不足,无法打开,临时的解决办法是 chmod 0+rw /dev/ttyUSB0 但是这个重启后便没了作用 ...
- C++STL学习笔记_(4)queue
10.2.5Queue容器 Queue简介 ² queue是队列容器,是一种"先进先出"的容器. ² queue是简单地装饰deque容器而成为另外的一种容器. ² #inc ...
- ActiveMQ(5.10.0) - JNDI Support
1. Place the jndi.properties file on the classpath. java.naming.factory.initial = org.apache.activem ...
- Spring(3.2.3) - Beans(1): Spring 容器
BeanFactory & ApplicationContext org.springframework.beans.factory.BeanFactory 是最基本的 Spring 容器接口 ...
- Mac电脑svn使用经验,Mac电脑使用android studio使用经验
1.先查看mac本身是否自带java1.6 没有去appstore里面安装 2.http://www.android-studio.org/ 下载mac版的ide 3.安装完成ide后,打开and ...
- kettle
Kettle(中文名称叫水壶)是一款ETL工具,纯java编写,可以在Window.Linux.Unix上运行,绿色无需安装,数据抽取高效稳定.Kettle家族包括4个产品:Spoon.Pan.CHE ...
- 链接器工具错误 LNK2011
问题描述: 使用visual studio 2015编译apr-iconv失败,提示"链接器工具错误 LNK2011:未链接预编译对象:映像可能不能运行"错误. 原因分析: MSD ...