文档章节

简化Java中的异常处理

Jnoee
 Jnoee
发布于 2015/02/26 00:13
字数 1165
阅读 53
收藏 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 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于PC、数据中心、游戏控制台、科学超级计算机、移动电话和互...

Java小辰
05/23
0
0
J2EE 框架 - Spring

Spring Framework 是一个开源的 Java/Java EE 全功能栈(full-stack)的应用程序框架,以 Apache 许可证形式发布,也有 .NET 平台上的移植版本。该框架基于 Expert One-on-One Java EE Desi...

匿名
2008/09/07
0
77
SpringBoot实战(四)之使用JDBC和Spring访问数据库

这里演示的是h2databse示例,所以简单的介绍普及下h2database相关知识 H2数据库是一个开源的关系型数据库。 H2是一个嵌入式数据库引擎,采用java语言编写,不受平台的限制,同时H2提供了一个...

youcongtech
08/03
0
0
Lambda 表达式有何用处?如何使用?(针对Java8)

什么是Lambda? 我们知道,对于一个Java变量,我们可以赋给其一个“值”。 如果你想把“一块代码”赋给一个Java变量,应该怎么做呢? 比如,我想把右边那块代码,赋给一个叫做aBlockOfCode的J...

亭子happy
06/06
0
0

没有更多内容

加载失败,请刷新页面

加载更多

等语句含义

经常会看到某些网站的框架中会用到 <!--[if IE7]><![endif]--> 等语句,今天特意查阅了下它们的区别: <!--[if IE]>所有的IE可识别<![end if]--><!--[if !IE]>除IE外都能识别<![end if]-->......

度_
11分钟前
0
0
资源的有限性与任务的复杂性之间的矛盾

看了一篇文章How to Manage Connections Efficiently in Postgres, or Any Database, 文章讨论了如何管理Postgres数据库连接,列举了几种方式: 每个请求一个连接 连接复用 连接池 连接池管理...

52iSilence7
11分钟前
0
0
Python PEP8规范整理

PEP8规范总结 PEP8 是什么呢,简单说就是一种编码规范,是为了让代码“更好看”,更容易被阅读。 具体有这些规范,参考 PEP 8 --Style Guide for Python Code.当然也可以使用Pycharm检查或使...

_Change_
22分钟前
0
0
input去空格

货币转换while True:MonStr = input()if MonStr[:3] == "RMB":USD = eval(MonStr[3:])/6.78print("USD{:.2f}".format(USD))elif MonStr[:3] == "USD":RMB = eval(MonStr[3:......

fadsaa
26分钟前
0
0
单例设计模式

单例设计模式 设计模式介绍与代码编写 在编写程序时经常会遇到一些典型的问题或需要完成某种特定需求.设计模式就是针对这些问题和需求.在大量的实践中总结和理论化之后的代码结构.编程风格以...

码农屌丝
27分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部