为什么80%的码农都做不了架构师?>>>   

先来看一下API中对cause的解释:

Throwable 包含了其线程创建时线程执行堆栈的快照。它还包含了给出有关错误更多信息的消息字符串。最后,它还可以包含 cause(原因):另一个导致此 throwable 抛出的 throwable。此 cause 设施在 1.4 版本中首次出现。它也称为异常链 设施,因为 cause 自身也会有 cause,依此类推,就形成了异常链,每个异常都是由另一个异常引起的。

导致 throwable cause 的一个理由是,抛出它的类构建在低层抽象之中,而高层操作由于低层操作的失败而失败。让低层抛出的 throwable 向外传播是一种糟糕的设计方法,因为它通常与高层提供的抽象不相关。此外,这样做将高层 API 与其实现细节关联起来,假定低层异常是经过检查的异常。抛出“经过包装的异常”(即包含 cause 的异常)允许高层与其调用方交流失败详细信息,而不会招致上述任何一个缺点。这种方式保留了改变高层实现而不改变其 API 的灵活性(尤其是,异常集合通过其方法抛出)。

导致 throwable cause 的另一个 cause 是,抛出它的方法必须符合通用接口,而通用接口不允许方法直接抛出 cause。例如,假定持久集合符合 Collection 接口,而其持久性在 java.io 的基础上实现。假定 add 方法的内部可以抛出 IOException。实现可以与其调用方交流 IOException 的详细消息,同时通过以一种合适的未检查的异常来包装 IOException,使其符合 Collection 接口。(持久集合的规范应该指示它能够抛出这种异常。)

可以说很直观的解释了,但是具体怎么体现cause还有点模糊,于是手动测试:

public class LowerLevel {public void throwException(){throw new RuntimeException("lower exception");}
}
public class HighLevel {LowerLevel ll = new LowerLevel();public void hi(){try{ll.throwException();}catch (Exception e){throw new RuntimeException("high",e);}}public static void main(String[] args) {HighLevel highLevel = new HighLevel();highLevel.hi();}
}

执行之后抛出异常,控制台中打印的异常栈如下:

Exception in thread "main" java.lang.RuntimeException: highat com.iqiyi.mams.web.listener.HighLevel.hi(HighLevel.java:12)at com.iqiyi.mams.web.listener.HighLevel.main(HighLevel.java:18)at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)at java.lang.reflect.Method.invoke(Method.java:606)at com.intellij.rt.execution.application.AppMain.main(AppMain.java:140)
Caused by: java.lang.RuntimeException: lower exceptionat com.iqiyi.mams.web.listener.LowerLevel.throwException(LowerLevel.java:9)at com.iqiyi.mams.web.listener.HighLevel.hi(HighLevel.java:10)... 6 more

吼吼吼,一看就明白。同时还明白了异常中出现的6more是什么意思,数了一下,在上面hi下面的异常栈数量=6。以前还疑惑这个more到底去了哪里。

转载于:https://my.oschina.net/liufq/blog/872650

Throwable cause的使用相关推荐

  1. Throwable是java.lang包中一个专门用来处理异常的类

    答:Throwable是java.lang包中一个专门用来处理异常的类.它有两个子类,即Error 和Exception,它们分别用来处理两组异常. Error用来处理程序运行环境方面的异常,比如,虚 ...

  2. Throwable.异常

    Throwable.异常 参考文章: (1)Throwable.异常 (2)https://www.cnblogs.com/fjfsu/p/8613255.html 备忘一下.

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

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

  4. Throwable、Error、Exception、RuntimeException 区别 联系

    2019独角兽企业重金招聘Python工程师标准>>> 1.Throwable 类是 Java 语言中所有错误或异常的超类.它的两个子类是Error和Exception: 2.Err ...

  5. 使用Throwable获得栈信息

    AOP(Aspect Oriented Programming面向切面编程)可以很轻松的控制一个方法调用哪些类,也能够控制哪些方法允许被调用,一般来说切面编程(比如AspectJ)只能控制到方法级别, ...

  6. 10.5 Throwable类

    Throwable为super类下面子类有error和Exception两个大类. Exception包含:运行异常和编译异常. 异常: 异常体系: -----------|Throwable --- ...

  7. 得到当前堆栈信息的两种方式(Thread和Throwable)的方法

    今天看到有一个工具类中有一句 Thread.currentThread().getStackTrace()[2].getClassName(); 原来工作中遇到的问题:使用Thread.current ...

  8. Java基础知识——异常Throwable和Exception

    Java基础知识--异常Throwable和Exception Java设置了异常,旨在鼓励将方法中可能出现的异常告知给使用此方法的程序员(你和我!).当然了,这种方法是比较优雅的,让我们确切的知道是 ...

  9. java throwable用法_java – ExceptionHandler不能与Throwable一起使用

    与ExceptionHandler #value()属性指示的相反 Class extends Throwable>[] value() default {}; 和@ExceptionHandl ...

  10. public ServiceException() { super(); } public ServiceException(String message, Throwable cause,

    凡操作失败都应该抛出某种异常,为了便于管理自定义的异常,应该先创建这些异常的基类,在创建异常要生成[无参构造]方法,如下一样: 快捷键是: 代码区域->右键->source->Gen ...

最新文章

  1. 2017.9.12.语文
  2. 开源 java CMS - FreeCMS2.7 移动端首页静态化
  3. STM32,CAN总线过滤器的设置详细讲解
  4. 一、pytorch搭建实战以及sequential的使用
  5. python list元素合并_Python-列表+-01-两个列表各元素合并
  6. C++最普通的定时器功能实现
  7. android设置密码框,Android手机卫士之设置密码对话框
  8. python网络爬虫与信息提取北京理工大学ppt_北京理工大学Python网络爬虫与信息抽取学习笔记10,信息提取...
  9. 腾讯区块链+医疗,一场值得期待的卫生行业创新探索
  10. Centos7安装Caffe教程
  11. 算法题 高斯消元解线性方程组(Python)
  12. html/css(1)
  13. 关于ajax同步状态及sucess,complete的顺序的理解
  14. 戴尔g7 linux,颜值高性能强大 戴尔G7游戏本评测详解
  15. 右键快捷创建mk文件
  16. Flutter 解决App登录页面软键盘遮挡住登录按钮或顶起底部控件的问题
  17. 百度IFE前端学院-DAY1-Web开发概览
  18. 2018年6月编程语言tiobe排行
  19. vuejs中html2canvas使用 背景图和二维码海报图片保存到一张图片上 生成一张海报并下载
  20. matlab中示波器如何使用,[原创]Matlab上位机示波器(中) · 立羽博客

热门文章

  1. 协议转换器指示灯的含义
  2. js二进制十六进制转换
  3. 福昕阅读器:针对PDF文件无法添加注释、附注、书签等功能的解决方法
  4. 关于计算机应用技术的实践报告,计算机应用技术专业实习报告
  5. python-selenium-webdriver screenshot 截图失败
  6. oracle热备文档,Oracle双机热备方法
  7. 百姓网发帖机,发帖机是什么来的
  8. 脚本外挂-图色识别-大漠课程-鼠标键盘命令(二)
  9. adobe audition不能扫描vst插件的解决参考
  10. Android网络连接网络