在Java中,当你需要统一处理异常的时候,你是会选择catch (Exception),还是直接catch (Throwable)?

Java的异常体系

Throwable: Java中所有异常和错误类的父类。只有这个类的实例(或者子类的实例)可以被虚拟机抛出或者被java的throw关键字抛出。同样,只有其或其子类可以出现在catch子句里面。

Error: Throwable的子类,表示严重的问题发生了,而且这种错误是不可恢复的。

Exception: Throwable的子类,应用程序应该要捕获其或其子类(RuntimeException例外),称为checked exception。比如:IOException, NoSuchMethodException...

RuntimeException: Exception的子类,运行时异常,程序可以不捕获,称为unchecked exception。比如:NullPointException.

应该catch什么

其实只要是Throwable和其子类都是可以throw和catch的,那么如果在需要统一处理异常的地方,我们应该catch (Throwable th) 还是 catch (Exception)呢?

这两种处理的区别在于,catch throwable会把Error和其他继承Throwable的类捕捉到。而catch Exception只会捕捉Exception极其子类,捕捉的范围更小。先不考虑有其他的类继承了Throwable的情况下(附录A),第一种catch相当于比第二种catch多捕捉了把Error和其子类。

那么究竟Error是否需要捕捉呢?JDK中Error类的的注释(如下)里提到过,Error是一种严重的问题,应用程序不应该捕捉它。

An Error is a subclass of Throwable that indicates serious problems that a reasonable application should not try to catch. Most such errors are abnormal conditions. The ThreadDeath error, though a "normal" condition, is also a subclass of Error because most applications should not try to catch it.

A method is not required to declare in its throws clause any subclasses of Error that might be thrown during the execution of the method but not caught, since these errors are abnormal conditions that should never occur.

Java Lanuage Spec 7 中也提到:Error继承自Throwable而不是继承自Exception,是为了方便程序可以使用 "catch (Exception)"来捕捉异常而不会把Error也捕捉在内,因为Exception发生后可以进行一些恢复工作的,但是Error发生后一般是不可恢复的。

The class Error is a separate subclass ofThrowable, distinct from Exception in the class hierarchy, to allow programs to use the idiom "} catch (Exception e) { " (§11.2.3) to catch all exceptions from which recovery may be possible without catching errors from which recovery is typically not possible.

已经不难看出,Java本身设计思路就是希望大家catch Exception就足够了,如果有Error发生,catch了也不会有什么作用(附录B)。

引申,如何设计异常体系?

如何设计异常体系要根据你的项目的情况,类库框架,应用程序的异常设计方式都会有一些区别。下面简单谈谈个人对异常设计的一些看法

类库/框架

继承RuntimeException扩展一个新的异常作为整个类库的异常基类。这个异常应该可以满足大部分类库对异常的要求。

在实现中,在任何需要捕捉checked exception的地方都会把异常统一转化成这个新的异常。

对于有特殊需求,需要自定义异常的,就通过继承这个基类来实现自定义异常。

不对异常记录log(交给上层来处理)

案例

fastjson 

spring 自定义异常比较多,不过都是继承自org.springframework.core.NestedRuntimeException,而这个异常也是继承自RuntimeException。

应用程序

设计上和框架异常类似,只是在捕捉checked exception的时候需要log

如果需要根据异常进行不同的处理,建议给自定义异常增加一个ERROR_CODE字段,这样无论在服务器还是客户端都可以根据不同的ERROR_CODE进行对应的处理。但是出现这种情况的时候,应该需要考虑一下设计思路了,一般来讲根据异常来决定业务流程不是一个好的设计方案。

附录A:是否应该直接继承Throwable来扩展新的异常?

个人认为异常都应该继承自Exception或者RuntimeException,而且Java本身对Exception和Error的规划就很清晰了,Java自己类库中没有异常是直接继承自Throwable的。

附录B:Error可以catch吗? 可以catch了后做些其他处理吗?

Error是可以catch的,而且也可以向常规Exception一样被处理,而且就算不捕捉的话也只是导致当前线程挂掉,其他线程还是可以正常运行,如果有需要的话捕捉Error之后也可以做些其他处理。但是Error是一种系统内部的错误,这种错误不像Exception一样是可能是程序和业务上的错误是可以恢复的。

假设进行网络连接操作的时候,IOException 发生了,可能是网络中断,我可以再尝试几次。

假设OutOfMemoryError发生了,就算被捕捉了,可以有什么手段让程序正常运行下去吗? 假设ExceptionInInitializerError发生了,类无法被正常初始化,这个是可以通过捕捉来恢复的吗?

java catch throwable_如何处理异常? catch Exception OR catch Throwable相关推荐

  1. Java的知识点19——异常机制Exception

    异常(Exception)的概念 异常指程序运行过程中出现的非正常现象,例如用户输入错误.除数为零.需要处理的文件不存在.数组下标越界等. Java是采用面向对象的方式来处理异常的.处理过程: 1.  ...

  2. 如何处理异常? catch Exception OR catch Throwable

    如何处理异常? catch Exception OR catch Throwable 参考文章: (1)如何处理异常? catch Exception OR catch Throwable (2)ht ...

  3. catchlog是什么软件_如何处理异常? catch Exception OR catch Throwable

    在Java中,当你需要统一处理异常的时候,你是会选择catch (Exception),还是直接catch (Throwable)? Java的异常体系 Throwable: Java中所有异常和错误 ...

  4. JAVA→异常、异常类体系结构、try→catch→finally处理异常、throw new Exception(“重构异常“);、throws Exception{ }、自定义异常

    没有异常处理的话,程序发生异常,将终止. 有了异常处理的话,程序发生异常,也继续执行. 有try时,不发生异常执行try→finally,发生异常执行try→catch→finally 多个catch ...

  5. java多层catch语句_Java异常之catch语句块

    今天在阅读项目代码时看到如下奇怪的代码,以为是竖线 | 可以作为多类型赋值,经过网上搜索才知道是Java SE 7新增的功能:一个catch捕获多种类型的异常.原文是Java官方的文档,现翻译如下.红 ...

  6. java获取异常的数据_Java(8题):异常,通过try catch进行处理,登录,商品,使用jdbc进行读取,详细图析...

    // 1.要求输入班级人数,人数必须是正整数.通过异常机制来处理下,提示输入的人数不能为负数 package a; import java.util.Scanner; public class yic ...

  7. Java异常之try,catch,finally,throw,throws

    Java异常之try,catch,finally,throw,throws 你能区分异常和错误吗? 我们每天上班,正常情况下可能30分钟就能到达.但是由于车多,人多,道路拥挤,致使我们要花费更多地时间 ...

  8. JAVA day24,25,26 异常(try、catch、finally、throw、throws),线程(Thread、Runnable、Callable)

    一.异常 异常 :指的是程序在执⾏过程中,出现的⾮正常的情况,最终会导致JVM的⾮正常停⽌. 在Java等⾯向对象的编程语⾔中,异常本身是⼀个类,产⽣异常就是创建异常对象并抛出了⼀个 异常对象.Jav ...

  9. java try catch陷阱_java异常捕捉陷阱(内存泄漏,finally块,catch块,继承得到的异常)...

    1.    异常捕捉的陷阱 异常处理机制是java语言的特色之一,尤其是java语言的Checked异常,更是体现了java语言的严谨性:没有完善错误处理的代码根本不会被执行.对于Checked异常, ...

最新文章

  1. 【Kotlin】Kotlin enum 枚举类 ( 常用用法 | 初始化成员变量 | 实现抽象方法 | 实现接口 | 获取名称和位置索引 | 调用枚举常量方法 )
  2. 数据科学学习心得_学习数据科学时如何保持动力
  3. 第二十六期:100 个网络基础知识普及,看完成半个网络高手
  4. 2010-12-1至2011-06-11
  5. 使用threading模块实现多线程
  6. c 与mysql连接_c与mysql的连接
  7. ltsc教育许可激活_教育部征求有关开放许可要求的意见
  8. 发稿猫:5步分析钟薛高、东鹏特饮新品牌如何做营销
  9. 条形码扫描模块的作用是什么?有什么应用意义?
  10. 分享几个免费IP地址查询API接口
  11. 10电脑睡眠后自动关机怎么回事 win_win10睡眠变自动关机怎么办
  12. python2 assert判断字典的包含关系
  13. word恢复忘记保存的文档
  14. opengl绘制三维人物luweiqi
  15. 重启电脑后MySQL数据丢失_为什么当我重启电脑时会出现数据丢失?
  16. 【经验分享】Web前端开发测试常见问题总结
  17. Keil警告和报错处理
  18. 医学图像重采样spacing和direction
  19. [转]九型人格的一句话描述
  20. ROS理论与实践——二、ROS基础

热门文章

  1. python匿名函数lambda
  2. (python)用户输入一段英文,然后输出这段英文中所有长度为3的英文单词
  3. 解压缩文件:压缩(zipped)文件夹错误,拒绝访问
  4. java 报表打印_Java报表打印之Flash打印
  5. pyautogui库的运用案例
  6. switch_status not allowed等物理dataguard 正常切换 脚色转换
  7. APK反编译学习心得
  8. 遗传算法(matlab)
  9. Matlab:创建复数
  10. 练习二 员工信息登记表(表单)