文档章节

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

猪刚烈
 猪刚烈
发布于 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
关于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
开发中一直忽略的一个问题:类的初始化

做了一年的互联网开发,从开始接触互联网,编写简单功能的实现到自己设计核心类并实现全部功能。 在开发过程中,一直被我忽略的问题让我在去年的开发中有了一点认识 这个问题就是关于类的初始...

deepler
2013/04/13
0
1

没有更多内容

加载失败,请刷新页面

加载更多

下一页

shell-日志脚本小实验

1.查找日志2018-8-15,求得那一分钟访问量最大。 #/bin/bash#from cc#2018-8-15#2018-08-15.log 哪一分钟 访问量 最大for d in `ls /data/nginx/logs/`doif [ -a 2018-08-15...

chencheng-linux
昨天
0
0
Android中的设计模式之状态模式

参考 《设计模式:可复用面向对象软件的基础 》5.8 State 状态 对象行为型模式 《Android源码设计模式解析与实战》第7章 随遇而安--状态模式 意图 允许一个对象在其内部状态改变时改变它的行...

newtrek
昨天
0
0
xshell端 vim没有颜色

说明 使用xshell连接服务器的时候,使用vim打开文档没有颜色 解决方法: 1.在更目录home或者etc下找到vim的配置文件vimrc 2.vim打开它找个坑,添加下面这个东西 set t_Co=256 3.保存退出,就...

杉下
昨天
0
0
spring 资料

spring boot http://www.ityouknow.com/springboot/2016/01/06/spring-boot-quick-start.html

zaolonglei
昨天
2
0
TypeScript基础入门 - 函数 - 简介

转载 TypeScript基础入门 - 函数 - 简介 项目实践仓库 https://github.com/durban89/typescript_demo.gittag: 1.1.6 为了保证后面的学习演示需要安装下ts-node,这样后面的每个操作都能直接...

durban
昨天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部