文档章节

关于系统异常设计的再思考

猪刚烈
 猪刚烈
发布于 2014/10/12 11:39
字数 1001
阅读 12
收藏 0

1.是否需要已检测异常


《Clean Code》一书对已检测异常是持完全否定态度的。事实上,有很多人是不认可已检测异常的,一方面,在目前的主流语言中,只有java提供了已检测异常机制,那么这从反面证明已检测异常并不是一种“必须”或者说是“优秀”的语言机制。已检测异常的设计初衷是希望借助编译期的检查来强制异常处理,从而有助于构建出健壮的系统。但正如《Clean Code》一书所说,那些没有已检测异常的语言就不能构建健壮的系统么?显然不是,也就是说已检测异常并不是"看上去那么美"。另一方面,人们普遍认为引入已检测异常的一个很大的代价就是违反了开闭原则。一旦底层的某个方法需要修改接口抛出一个已检测异常,那么上层的所有调用接口都不能幸免,它们的接口或是实现也必然需要做出改动!再比如:一个较“底层”的方法抛出已检测异常,如果上层方法对此异常也“无能为力”的话会怎样呢?捕获而不处理是肯定不正确的。而如果再抛出就需要有一个合适的异常来包裹一下以便符合当前方法的抽象级别。

2.对于一个异常应该根据什么原则来确定它应该是已检测异常还是未检查异常?


实际上,如果在回答第一个问题时,我们选择了不使用已检测异常的话,也就不存在这个问题了。但是在广泛使用已检测异常的系统里,知道怎样区分已检测异常和未检测异常是非常必要的。一般来说:从调用者的角度去看,已检测异常是那些完全有理由能“预见”或是“重现”的异常情况。那这也正意未着方法本身明确要求调用者不能忽视(既然它已经预见到可能会发生了)这些异常情况。基于这样的准则,我们说:几乎所有的业务异常(有深刻业务含义的异常)都应该是已检测异常。除此之外都应该属于程序性错误,也就是未检测异常。
这看起来很简单,但是却忽略了一个问题:抽象级别的问题。现在的系统都是依赖各种框架或组件构建起来的。在框架和组件级别,一些“当然”业务上的已检测异常,在上层看来是很“底层”的“技术”问题。比如,在一个文件处理框架里,FileNotFoundException是一个很自然的“业务”异常,因而是一个已检测异常。但是对于调用者来说,如果对此异常也“无能为力”会怎样呢?捕获而不处理是肯定不正确的。而如果再抛出就需要有一个合适的异常来包裹一下以便符合当前方法的抽象级别。这样看,处理已检测异常确实是很“劳神”的(当然你可以说这正是它的优点)。

3.视图层的异常统一处理方法
当异常一直浮升到视图层时,就需要考虑以何种方式通知用户系统出现了问题。当发生异常时跳转到统一的异常处理页面显示错误信息是一种普遍的做法。至于说在当前页面弹出对话框显示异常的形式可能会更加友好一些。但是由于页面请求既有http请求又有ajax请求的话,弹出对话框的方式可能有些技术上的困难。 

本文转载自:http://blog.csdn.net/bluishglc/article/details/6241454

共有 人打赏支持
猪刚烈
粉丝 22
博文 708
码字总数 110
作品 1
海淀
程序员
【外刊IT评论】清除代码异味

本文是从 Cleaning up code smells: Venkat Subramaniam @ Chennai 这篇文章翻译而来。 今天,Venkat Subramaniam 就关于清除代码异味的话题给我们做了一个非常有趣的演讲。下面就是我记录的...

红薯
2011/05/18
1K
8
Code Complete——读书笔记(2)

异常处理是现代计算机科学最棘手的问题之一,你不能随意的对待它。一些人估计一个程序90%的代码用于异常处理,也就是说只有10%的代码用于处理正常逻辑。既然这么多的代码用于异常处理,那么在...

Kiss_Coder
2016/09/28
13
0
读书笔记:A Philosophy of Software Design (一)

今天一位同事在斯坦福的博士生导师John Ousterhout (注,Tcl语言的设计者)来公司做了他的新书《A Philosophy of Software Design》的演讲,介绍了他对于软件设计的思考。这里我把本书的读书...

naughty
09/01
0
0
关于Kotlin抛弃可检测的异常处理,你怎么看?

可检测的异常英文翻译为Checked Exception,以下简称为CE。CE是一个备受争议的话题,有人主张CE是一个不可或缺的特性,也有人认为CE带来了一些问题,是一个冗余特性。这其中的支持者和反对者...

欧阳锋
04/23
0
0
关于 IO 和 NIO 的思考

I/O 的实际操作由内核执行,其中一个重要手段是缓冲区。简单来说 I/O 可分为两类:面向磁盘和面向网络,Java 也是针对这两者来抽象设计 API,相关的类主要在 和 包中,简称为 BIO 和 NIO。 ...

wskwbog
07/24
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Java GC机制详解

垃圾收集 Garbage Collection 通常被称为“GC”,本文详细讲述Java垃圾回收机制。 导读: 1、什么是GC 2、GC常用算法 3、垃圾收集器 4、finalize()方法详解 5、总结--根据GC原理来优化代码 ...

小刀爱编程
27分钟前
1
0
ORACEL学习--理解over()函数

二、理解over()函数 1.1、两个order by的执行时机 分析函数是在整个sql查询结束后(sql语句中的order by的执行比较特殊)再进行的操作, 也就是说sql语句中的order by也会影响分析函数的执行结果...

spinachgit
29分钟前
1
0
抽象语法树

import asttree = ast.parse('def hello_word(): print("hello world!")')def hell_word(): print(1)print(ast.dump(tree)) 语法树 可以基于这个实现另外一种编程语言...

colin_86
30分钟前
2
0
Akka查询设备组《fourteen》译

加入以下依赖到项目中: 介绍: 到目前为止,我们看到的会话模式很简单,因为它们要求Actor保持很少或没有状态。 特别: 设备actor返回一个读数,不需要更改状态。 记录温度,更新单个字段。...

woshixin
37分钟前
1
0
wait、notify、notifyAll 的用法

wait()、notify()、notifyAll()是三个定义在Object类里的方法,用来控制线程的状态。这三个方法最终调用的都是jvm的native方法, 随着jvm运行平台的不同可能有些许差异。 wait(): 使持有该对...

noob_fly
39分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部