文档章节

简化Java中的异常处理

Jnoee
 Jnoee
发布于 2015/02/26 00:13
字数 1165
阅读 55
收藏 0

#1. 不需要Checked异常 Java中的Checked异常,可以说有弊无利,它除了能带来一系列的麻烦,能干的事情Unchecked异常都能干。 ##1.1. 代码污染 首先,当一个方法声明抛出一个Checked异常时,该方法的后面就得加上throws XxxException;其次,该方法的调用者必须要处理这种异常:要么继续抛出,调用方法也得加上throws XxxException;要么捕获处理,处理方式可能是记录日志、处理异常流或者再包装一次抛出去;再次,当方法增加另一个Checked异常时,调用者也必须增加这个异常处理,否者代码编译都会出错。 ##1.2. 调用者未必需要或能够处理这个异常 Checked异常强调调用者需要处理这种异常,但绝大部分情况是你根本不知道调用者是否真的需要,或者调用者是否有能力去处理这种异常。例如:SQLException,调用者除了能记录日志或者包装一下继续抛出,还能做什么?在程序运行过程中用代码去修复错误的SQL语法吗? ##1.3. 都可以用Unchecked异常替代 Checked异常除了强制调用者捕获处理以外,并不比Unchecked异常能够携带更多信息。举个常用的例子:用户登录,可能输入错误的用户名或密码,需要定义两个异常:UserNotFoundExceptionPasswordNotMatchException。把这两个异常定义为Checked异常看上去无可厚非了,调用者显然是必须也能够处理这两个异常的。但反过来想,这两个异常为什么不能定义为Unchecked异常呢?如果调用者需要分别提示用户不同的信息,就分别捕获处理;如果调用者需要统一提示用户:用户名或密码错误,就一起捕获处理;如果调用者本身就有一个顶层统一的异常处理机制呢,就让它直接抛到顶层去处理好了。聪明的Shiro框架就是这么干的,所有的验证异常全部都是Unchecked异常。

#2. 不需要太多的异常 通常情况下,应用这个层面的代码只需要两种异常:系统异常和业务异常。系统异常用来告诉用户:系统繁忙,请稍后再试(通常都是这么委婉,实际可能是某个BUG发作了 ^_^);业务异常,用来告诉用户具体的业务操作提示信息(新增用户时,提示用户名已存在之类的),提示信息放在message属性里就好了。两种异常,也就是两个异常类,它们可以处理掉80%-90%的异常。剩下的情况,只有当需要对某种类型的异常流程进行特殊处理时,才需要增加异常类。例如对外开放API接口时,或许需要定义一个ApiException,用来返回错误的消息。

#3. 把异常抛到顶层处理 应用可能分很多层,在顶层设计一个异常处理框架来统一处理异常是明智的选择。例如三层结构的web应用,应该在表现层统一处理异常,而不是让异常处理分布在各个层面,像Spring MVC、Struts这些MVC框架都有统一异常处理机制,用好它们就行了。 异常处理往往是开发人员处理不好的一个环节,而这个环节处理又会带来比较大的麻烦,例如错误的处理导致异常中断了,最终连错误日志都找不到。设计好一个顶层异常处理机制,然后告诉开发人员不用处理异常,这样可以尽可能的避免发生这样的问题。 正因如此,异常需要透传到顶层,代码又需要保持优雅,所以Unchecked异常才是必然的选择,优秀的开源框架都是这么干的。

© 著作权归作者所有

共有 人打赏支持
Jnoee
粉丝 4
博文 8
码字总数 5282
作品 0
深圳
架构师
私信 提问
对JDBC的支持 之 7.1 概述

概述 JDBC回顾 传统应用程序开发中,进行JDBC编程是相当痛苦的,如下所示: //cn.javass.spring.chapter7. TraditionalJdbcTest @Test public void test() throws Exception { Connection co...

heroShane
2014/02/27
0
0
给Java新手的一些建议——Java知识点归纳(Java基础部分)

  写这篇文章的目的是想总结一下自己这么多年来使用java的一些心得体会,主要是和一些java基础知识点相关的,所以也希望能分享给刚刚入门的Java程序员和打算入Java开发这个行当的准新手们,...

Java工程师-10
2017/05/24
509
2
Java 7 的 7 个新的 “酷” 特性

Java 7 即将在本月底发布了,先来看 Java 7 中的一些不错的新酷特性吧: 1. switch 中使用字符串变量 2. 简化泛型对象创建 3. 多异常处理 4. 资源的自动释放 5. 文件 IO API 的改进 下面是列...

红薯
2011/07/11
3.9K
38
Java编程基础知识点和技术点归纳

Java是一种可以撰写跨平台应用软件的面向对象的程序设计语言。Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于PC、数据中心、游戏控制台、科学超级计算机、移动电话和互...

Java小辰
05/23
0
0
Midao JDBC 0.9.4 发布,JDBC 工具包

Midao JDBC 0.9.4 是一个维护版本,包含大量的重构,废弃了一些类,以及一些类修改了名称。 Midao JDBC 简化了 JDBC 的开发,特点是灵活、可定制、简单直观,提供大量的功能,包括事务处理、...

oschina
2013/08/03
1K
4

没有更多内容

加载失败,请刷新页面

加载更多

Spring源码学习笔记-1-Resource

打算补下基础,学习下Spring源码,参考书籍是《Spring源码深度解析》,使用版本是Spring 3.2.x,本来想试图用脑图记录的,发现代码部分不好贴,还是作罢,这里只大略记录下想法,不写太细了 ...

zypy333
今天
10
0
RestClientUtil和ConfigRestClientUtil区别说明

RestClientUtil directly executes the DSL defined in the code. ConfigRestClientUtil gets the DSL defined in the configuration file by the DSL name and executes it. RestClientUtil......

bboss
今天
17
0

中国龙-扬科
昨天
2
0
Linux系统设置全局的默认网络代理

更改全局配置文件/etc/profile all_proxy="all_proxy=socks://rahowviahva.ml:80/"ftp_proxy="ftp_proxy=http://rahowviahva.ml:80/"http_proxy="http_proxy=http://rahowviahva.ml:80/"......

临江仙卜算子
昨天
11
0
java框架学习日志-6(bean作用域和自动装配)

本章补充bean的作用域和自动装配 bean作用域 之前提到可以用scope来设置单例模式 <bean id="type" class="cn.dota2.tpye.Type" scope="singleton"></bean> 除此之外还有几种用法 singleton:......

白话
昨天
10
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部