from:http://blog.csdn.net/seablue_xj/article/details/5490793

使用Checked Exception还是UnChecked Exception

如果你希望强制你的类调用者来处理异常,那么就用Checked Exception; 
如果你不希望强制你的类调用者来处理异常,就用UnChecked。

那么究竟强制还是不强制,权衡的依据在于从业务系统的逻辑规则来考虑,如果业务规则定义了调用者应该处理,那么就必须Checked,如果业务规则没有定义,就应该用UnChecked。

还是拿那个用户登陆的例子来说,可能产生的异常有: 
          IOException (例如读取配置文件找不到) 
          SQLException (例如连接数据库错误) 
          ClassNotFoundException(找不到数据库驱动类)

NoSuchUserException 
        PasswordNotMatchException

以上3个异常是和业务逻辑无关的系统容错异常,所以应该转换为RuntimeException,不强制类调用者来处理;而下面两个异常是和业务逻辑相关的流程,从业务实现的角度来说,类调用者必须处理,所以要Checked,强迫调用者去处理。

在这里将用户验证和密码验证转化为方法返回值是一个非常糟糕的设计,不但不能够有效的标示业务逻辑的各种流程,而且失去了强制类调用者去处理的安全保障。 
        至于类调用者catch到NoSuchUserException和PasswordNotMatchException怎么处理,也要根据他自己具体的业 务逻辑了。或者他有能力也应该处理,就自己处理掉了;或者他不关心这个异常,也不希望上面的类调用者关心,就转化为RuntimeException;或 者他希望上面的类调用者处理,而不是自己处理,就转化为本层的异常继续往上抛出来。

使用checked异常的最佳实践

现在假设有些错误我们确定为checked异常,那么我们针对这些checked异常要怎样编码才合理呢?

1 不要用checked异常做流程控制。无论如何,checked异常也是一种错误。只是我们可以处理(修复)它而已。这种错误和普通业务流程还是有区别 的,而且从效率上来说,用异常控制业务流程是不划算的。其实这个问题有时候很难界定,因为checked异常“可以修复”,那么就是说修复后程序照常运 行,这样一来真的容易跟普通业务流程混淆不清。比如注册用户时用户名已经存在的问题。这个时候我们要考虑,为什么要用checked异常?这和使用业务流 程相比,给我带来了什么好处?(注意checked异常可以修复,这是和unchecked异常本质的区别)照我的理解,checked异常应该是介于正 常业务流程和unchecked异常(严重错误)之间的一种比较严重的错误。出现了这种错误,程序无法完成正常的功能是肯定的了,但我们可以通过其他方式 弥补(甚至修复),总之不会让程序挂起就是。其实这一点也是设计checked异常时要考虑的问题,也是代价之一吧。

2 对checked异常的封装。这里面包括2个问题:

第一,如果要创建新的checked异常,尽量包含多一点信息,如果只是一条message,那么用Exception好了。当然,用Exception会失去异常的型别信息,让客户端无法判断具体型别,从而无法针对特定异常进行处理。

第二,不要让你要抛出的checked exception升级到较高的层次。例如,不要让SQLException延伸到业务层。这样可以避免方法签名后有太多的throws。在业务层将持久层的所有异常统统归为业务层自定义的一种异常。

客户端调用含有throws的方法要注意:

第一,不要忽略异常。既然是checked异常,catch clause里理应做些有用的事情??修复它!catch里为空白或者仅仅打印出错信息都是不妥的!为空白就是假装不知道甚至瞒天过海,但是,出来混迟早 要还的,迟早会报unchecked异常并程序挂起!非典就是个例子。打印出错信息也好不到哪里去,和空白相比除了多几行信息没啥区别。如果 checked异常都被这么用,那真的不如当初都改成unchecked好了,大家都省事!

第二,不要捕获顶层的Exception。你这么干,就是在犯罪!因为unchecked异常也是一种Exception!你把所有异常都捕获了??不是 我不相信你的能力,你根本就不知道该如何处理!这样做的直接的后果就是,你的程序一般来说是不会挂起了,但是出现错误的时候功能废了,表面上却看不出什 么!当然,深究起来,这也不是什么罪大恶极,如果你在catch里打印了信息,这和上面那条的情况是差不多的。而这2条的共同点就是,没有正确使用 checked异常!费了那么大劲设计的checked异常就是给你们上级(客户端)用的,结果你们不会用!真的不如用unchecked干脆利落了!

from:http://blog.csdn.net/ycyangcai/article/details/5323893

使用Checked Exception还是UnChecked Exception的原则,我的看法是根据需求而定。

如果你希望强制你的类调用者来处理异常,那么就用Checked Exception; 
如果你不希望强制你的类调用者来处理异常,就用UnChecked。

那么究竟强制还是不强制,权衡的依据在于从业务系统的逻辑规则来考虑,如果业务规则定义了调用者应该处理,那么就必须Checked,如果业务规则没有定义,就应该用UnChecked。

还是拿那个用户登陆的例子来说,可能产生的异常有:

IOException (例如读取配置文件找不到) 
SQLException (例如连接数据库错误) 
ClassNotFoundException(找不到数据库驱动类)

NoSuchUserException 
PasswordNotMatchException

以上3个异常是和业务逻辑无关的系统容错异常,所以应该转换为RuntimeException,不强制类调用者来处理;而下面两个异常是和业务逻辑相关的流程,从业务实现的角度来说,类调用者必须处理,所以要Checked,强迫调用者去处理。

在这里将用户验证和密码验证转化为方法返回值是一个非常糟糕的设计,不但不能够有效的标示业务逻辑的各种流程,而且失去了强制类调用者去处理的安全保障。

至于类调用者catch到NoSuchUserException和PasswordNotMatchException怎么处理,也要根据他自己具体的业务逻辑了。或者他有能力也应该处理,就自己处理掉了;或者他不关心这个异常,也不希望上面的类调用者关心,就转化为RuntimeException;或者他希望上面的类调用者处理,而不是自己处理,就转化为本层的异常继续往上抛出来。

uncheck exception非检查型异常,所有继承RuntimeException或者RuntimeException子类的异常都是uncheck exception。

check exception检查型异常,除非检查型异常外的异常都是检查型异常了。check exception需要程序员处理。

两个示例方法如下,分别代表了一个uncheck exception和check exception

uncheck exception:
[java] view plaincopyprint?
  1. public static void test2(String param){
  2. System.out.println("in test2");
  3. throw new IllegalArgumentException("抛出参数异常..."+param);
  4. }

check exception:

[java] view plaincopyprint?
  1. public static void test1() throws IllegalAccessException {
  2. System.out.println("in test1");
  3. throw new IllegalAccessException("抛出访问异常...");
  4. }
调用的时候:
[java] view plaincopyprint?
  1. public static void main(String args[]){
  2. try {
  3. test1();
  4. } catch (IllegalAccessException e) {
  5. e.printStackTrace();
  6. }
  7. test2("aa");
  8. }
执行结果如下: 
in test1 
java.lang.IllegalAccessException: 抛出访问异常... 
at com.xino.study.file.ExceptionTest.test1(ExceptionTest.java:8) 
at com.xino.study.file.ExceptionTest.main(ExceptionTest.java:18)in test2

Exception in thread "main" java.lang.IllegalArgumentException: 抛出参数异常...aa 
at com.xino.study.file.ExceptionTest.test2(ExceptionTest.java:13) 
at com.xino.study.file.ExceptionTest.main(ExceptionTest.java:22)

注意以上代码,在声明函数的时候,check exception需要throws异常出来,而uncheck exception不需要。调用的时候,check exception需要用try{}catch{}显式捕获异常并处理,uncheck exception不需要。

除了以上区别,还有其它区别,当程序执行过程中,遇到uncheck exception,则程序中止,不再执行之后的代码。修改main函数如下:

[java] view plaincopyprint?
  1. <textarea cols="50" rows="15" name="code" class="java">public static void main(String args[]){
  2. try {
  3. test1();
  4. } catch (IllegalAccessException e) {
  5. e.printStackTrace();
  6. }
  7. test2("aa");
  8. }  </textarea>

执行结果: 
in test2 
Exception in thread "main" java.lang.IllegalArgumentException: 抛出参数异常...aa 
at com.xino.study.file.ExceptionTest.test2(ExceptionTest.java:13) 
at com.xino.study.file.ExceptionTest.main(ExceptionTest.java:17)

可以看到test1函数根本没有执行到。

<script type="text/javascript"></script><script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript"></script>

check exception和uncheck exception相关推荐

  1. Checked exception及Unchecked exception对比

    一.异常分类 从异常处理机制的角度可以分为两类,Unchecked Exceptions和Checked Exceptions.Check即编译器检查程序是否已经抛出或处理了可能的异常.Uncheck ...

  2. java 判断exception类型_Checked Exception | Java语言设计者的失误?

    背景 最近公司一直在执行sonar扫描代码bug.漏洞及异味,但发现了很对异常处理的问题,大多数是对Java异常处理不正确导致的,那本文就谈谈Java的异常是什么?设计者的初衷又是什么? Except ...

  3. checked exception和unchecked exception区别

    http://blog.csdn.net/yuefengyuan/article/details/6204317 一. Java 中定义了两类异常: 1) Checked exception: 这类异 ...

  4. 记一次Jenkins 打包异常 ERROR: Exception when publishing, exception message [Failure]

    记一次Jenkins 打包异常 ERROR: Exception when publishing, exception message [Failure] 参考文章: (1)记一次Jenkins 打包 ...

  5. Jenkins发版常见问题:ERROR: Exception when publishing, exception message [Failure]

    Jenkins 报错日志: ERROR: Exception when publishing, exception message [Failure] Build step 'Send build a ...

  6. ERROR: Exception when publishing, exception message

    jenkins出现ERROR: Exception when publishing, exception message ERROR: Exception when publishing, excep ...

  7. ERROR: Exception when publishing, exception message [Failed to connect and initialize SSH connection

    JEKINS构建报以下错误:ERROR: Exception when publishing, exception message [Failed to connect and initialize ...

  8. java Exception问题:unhandled exception:java.lang.Exception

    当在代码成抛出异常时,会出现这个问题,这是因为我们在代码抛出了异常而并没有处理,这需要上一层去捕获这个异常,因此我们要在函数加上throws. public void test() throws Ex ...

  9. Java异常:选择Checked Exception还是Unchecked Exception?

    Java包含两种异常:checked异常和unchecked异常.C#只有unchecked异常.checked和unchecked异常之间的区别是: Checked异常必须被显式地捕获或者传递,如B ...

  10. [转载] Java异常:选择Checked Exception还是Unchecked Exception?

    参考链接: Java中的已检查与未检查异常| checked或unchecked异常 Java包含两种异常:checked异常和unchecked异常.C#只有unchecked异常.checked和 ...

最新文章

  1. 应届前端面试——看这篇就够了(一)
  2. linux系统最大支持多大硬盘容量,LINUX操作系统对硬件支持有上限么?最大多少内存?多大硬盘容量?...
  3. STM32 内存管理实验
  4. Socket java.net.SocketException: Connection reset的解决方案
  5. C# 接口(Interface)
  6. 数据结构:链表(c语言)
  7. Vmware中的centos虚拟机克隆之后没有eth0
  8. pgsql查表名_PostgreSQL 查询一个表
  9. python 浏览器自动化 弹窗控制_selenium 网页自动化 - 在访问一个网页时弹出的浏览器窗口,我该如何处理?...
  10. 【工具】(转)PowerDesigner最基础的使用方法入门学习
  11. 在学校外边找了份工作
  12. Synchronized的锁优化,kotlin中文文档pdf
  13. SNIC超像素分割python代码
  14. 数学知识:扩展欧几里得算法
  15. GB28181国标流媒体服务(LiveGBS)-支持海康8700等联网网关通过接入实现web端无插件直播
  16. POP3、SMTP和IMAP 协议
  17. golang中的错误fatal error: concurrent map writes
  18. pwnable tw Starbound writeup
  19. 用Python做出日历
  20. python爬取12306_python爬取12306列车信息

热门文章

  1. 制定目标的SMART原则(思维导图)
  2. 第二章 2.群中的等价关系 -- 陪集,共轭,正规子群与商群
  3. Java 相关知识的学习(第一章至第三章)
  4. 解线性方程组 c语言,C语言解线性方程组
  5. IDEA Eval Reset 插件找不到
  6. c语言 while 怎样用,C语言 while 的用法
  7. 微信公众号推文怎么做?
  8. 阿里java面试流程_阿里巴巴JAVA开发工程师面试经验
  9. 解决Access denied for user ''@'localhost' to database 'mysql'问题
  10. eth的geth钱包安装