Throwable cause的使用
为什么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的使用相关推荐
- Throwable是java.lang包中一个专门用来处理异常的类
答:Throwable是java.lang包中一个专门用来处理异常的类.它有两个子类,即Error 和Exception,它们分别用来处理两组异常. Error用来处理程序运行环境方面的异常,比如,虚 ...
- Throwable.异常
Throwable.异常 参考文章: (1)Throwable.异常 (2)https://www.cnblogs.com/fjfsu/p/8613255.html 备忘一下.
- 如何处理异常? catch Exception OR catch Throwable
如何处理异常? catch Exception OR catch Throwable 参考文章: (1)如何处理异常? catch Exception OR catch Throwable (2)ht ...
- Throwable、Error、Exception、RuntimeException 区别 联系
2019独角兽企业重金招聘Python工程师标准>>> 1.Throwable 类是 Java 语言中所有错误或异常的超类.它的两个子类是Error和Exception: 2.Err ...
- 使用Throwable获得栈信息
AOP(Aspect Oriented Programming面向切面编程)可以很轻松的控制一个方法调用哪些类,也能够控制哪些方法允许被调用,一般来说切面编程(比如AspectJ)只能控制到方法级别, ...
- 10.5 Throwable类
Throwable为super类下面子类有error和Exception两个大类. Exception包含:运行异常和编译异常. 异常: 异常体系: -----------|Throwable --- ...
- 得到当前堆栈信息的两种方式(Thread和Throwable)的方法
今天看到有一个工具类中有一句 Thread.currentThread().getStackTrace()[2].getClassName(); 原来工作中遇到的问题:使用Thread.current ...
- Java基础知识——异常Throwable和Exception
Java基础知识--异常Throwable和Exception Java设置了异常,旨在鼓励将方法中可能出现的异常告知给使用此方法的程序员(你和我!).当然了,这种方法是比较优雅的,让我们确切的知道是 ...
- java throwable用法_java – ExceptionHandler不能与Throwable一起使用
与ExceptionHandler #value()属性指示的相反 Class extends Throwable>[] value() default {}; 和@ExceptionHandl ...
- public ServiceException() { super(); } public ServiceException(String message, Throwable cause,
凡操作失败都应该抛出某种异常,为了便于管理自定义的异常,应该先创建这些异常的基类,在创建异常要生成[无参构造]方法,如下一样: 快捷键是: 代码区域->右键->source->Gen ...
最新文章
- 2017.9.12.语文
- 开源 java CMS - FreeCMS2.7 移动端首页静态化
- STM32,CAN总线过滤器的设置详细讲解
- 一、pytorch搭建实战以及sequential的使用
- python list元素合并_Python-列表+-01-两个列表各元素合并
- C++最普通的定时器功能实现
- android设置密码框,Android手机卫士之设置密码对话框
- python网络爬虫与信息提取北京理工大学ppt_北京理工大学Python网络爬虫与信息抽取学习笔记10,信息提取...
- 腾讯区块链+医疗,一场值得期待的卫生行业创新探索
- Centos7安装Caffe教程
- 算法题 高斯消元解线性方程组(Python)
- html/css(1)
- 关于ajax同步状态及sucess,complete的顺序的理解
- 戴尔g7 linux,颜值高性能强大 戴尔G7游戏本评测详解
- 右键快捷创建mk文件
- Flutter 解决App登录页面软键盘遮挡住登录按钮或顶起底部控件的问题
- 百度IFE前端学院-DAY1-Web开发概览
- 2018年6月编程语言tiobe排行
- vuejs中html2canvas使用 背景图和二维码海报图片保存到一张图片上 生成一张海报并下载
- matlab中示波器如何使用,[原创]Matlab上位机示波器(中) · 立羽博客