java异常信息丢失之异常链

揭秘Java异常链:从表象到本质的错误追踪 简单来说,异常链是将一个异常作为另一个异常的原因(Cause)进行存储。当捕获一个异常时,我们可以将它包装成一个新的异常,并传递给后续的代码。Java的Throwable类(包括Exception和Error构造方法,用于指定异常的原因。方法,用于在抛出异常后设置原因。getCause()方法,用于获取异常的原因。通过这些方法,Java可以保存异常之间的因果关系,从而形成异常链。异常链是Java中一个实用的功能,它为开发者提供了捕获和追踪错误的能力。 阅读详情

异常链

除了 try…catch…finally我们还知道些什么,是不是这就是全部了呢?那我们就用案例告诉你,事实不仅仅如此。

先来看一个异常捕获情况


package com.test;

import java.io.IOException;

public class TestB {

    void method1() throws Exception {
        throw new Exception("exception method1");
    }

    void method2() throws Exception {
        try {
            method1();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            Exception c = new Exception();
            //异常连
            //c.initCause(e);
            throw c;

        }
    }

    void method3() throws Exception {
        try {
            method2();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            Exception c = new Exception();
            //异常连
           //c.initCause(e);
            throw c;
        }
    }

    public static void main(String[] args) {

        try {
            new TestB().method3();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

}

OUTPUT :

java.lang.Exception
    at com.test.TestB.method3(TestB.java:29)
    at com.test.TestB.main(TestB.java:39)

为什么只是打印出来了TestB.java:29而没有打印出exception method1呢?

如果异常信息丢失那么在这个工作空间(workspace)中去寻找最初的异常爆发点就如同大海捞针了。所以异常信息丢失对于开发人员测试自己的代码无疑是一大损失。
这里我们从异常打印信息中完全不知道根本的问题在哪里。特别是当项目越来越大时就更是大海捞针,对修bug的人来说实在耗时又费力。

异常捕获后异常处理到底做了什么

开发人员通过catch(捕获)了异常,并且也处理的异常,但是在处理的过程中又抛出了新的异常

 try{
        //code
    }catch(Exception e)
    {
        //do something to process exception
        throw new Exception();
    }

这时java异常处理机制将对捕获的异常信息进行清除,将异常发生地设在新抛出异常的位置(throw new Exception();位置),相当于执行了e.fillInStackTrace()方法。就我举的例子来讲,在查看异常信息时还有可能知道最初的异常发生地在哪里,但是当程序发生嵌套调用或者远程调用时,或者说try{}子句中的代码很多时,对于我们来说寻找最初的异常发生地就是件很难的事了。所以为了解决这样的问题,java异常处理机制提供了一种名为“异常链”的方式。异常链的作用是承接上一次异常信息到当前新抛出的异常中。

异常链

我们将上面的例子稍作修改就可以了

try{
    //code
}catch(Exception e)
{
    //do something to process exception
    throw new Exception(e);//异常链
}

同理我们修改上面的案例如下
new Exception(e);//异常链

package com.test;

import java.io.IOException;

public class TestB {

    void method1() throws Exception {
        throw new Exception("exception method1");
    }

    void method2() throws Exception {
        try {
            method1();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            Exception c = new Exception(e);
            //异常连
            //c.initCause(e);
            throw c;

        }
    }

    void method3() throws Exception {
        try {
            method2();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            Exception c = new Exception(e);
            //异常连
           //c.initCause(e);
            throw c;
        }
    }

    public static void main(String[] args) {

        try {
            new TestB().method3();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

}

OUTPUT :

java.lang.Exception: java.lang.Exception: exception method1
    at com.test.TestB.method3(TestB.java:29)
    at com.test.TestB.main(TestB.java:39)
Caused by: java.lang.Exception: exception method1
    at com.test.TestB.method1(TestB.java:8)
    at com.test.TestB.method2(TestB.java:13)
    at com.test.TestB.method3(TestB.java:26)
    ... 1 more

这里直接打印处理“exception method1”

除了这种添加异常链的方式,我们也可以修改原始样例
去掉如下行的所有注释,也会有构造方式异常链同样的效果
//c.initCause(e);

构造方式异常链

将当前的异常作为即将要抛出异常构造方法的一个参数传入,这样在输出异常信息时会自动去检查是否存在原始异常,如果存在则先输出原始异常信息。目前在JDK中这样可以接收原始异常的异常类只有Throwable 、Exception、RuntimeException。所以自定义的异常类要想能够实现异常链的功能必须在继承上述三个类的同时添加一个构造方法能够接收原始异常,并调用父类的对应够方法。

initCause异常链

这个异常链的特性是所有异常均具备的,initCause()方法是从Throwable继承的

参考资料

http://blog.chinaunix.net/uid-26863299-id-3556117.html
http://blog.chinaunix.net/uid-26863299-id-3556117.html

vins-mono保存、重载地图、evo工具测试 下面咱们来对vins-mono的重定位vins-mono官方源码地址:https://github.com/HKUST-Aerial-Robotics/VINS-Mono https://blog.youkuaiyun.com/learning_tortosie/article/details/83182258 运行这条: roslaunch benchmark_publisher publish.launc... 阅读详情

相关推荐

第二十三章 Nest集成日志框架Winston

Winston是一个非常流行的Node.js日志框架,而Nest.js是一个基于Node.js的后端框架。修改 winston.module.ts 内容如下 添加 forRoot 方法,接收 winston 的 createLogger 方法的参数,返回动态模块的 providers、exports。这里用到了 printf 的 format 函数,它可以自定义打印的日志格式 且使用了chalk 加上了颜色,并且打印了 dayjs 格式化的时间。可以看到控制台打印了自定义的 logger 的自定义。

枫ゞ的博客 1069

【Java异常】Java异常监控重要手段 --异常链

异常链”无论是在框架源码中还是在日常项目开发中,都是一项非常重要的对异常处理的手段。以下摘抄自《Java编程思想》对异常链的介绍:常常会想要在①捕获一个异常后抛出另一个异常②并且希望把原始异常的信息保存下来,这被称为异常链。略。

qq_43783527的博客 2136

华为海思2026届数字IC秋招笔试真题解析与实战技巧(2025最新版)

本文深度解析华为海思2026届数字IC秋招笔试真题,涵盖高频考点如后端设计、低功耗设计、SystemVerilog语法等核心内容。提供时序违例修复、时钟树综合等实战技巧,帮助考生高效备考。特别关注UPF低功耗设计规范等最新考点,助力考生在秋招笔试中脱颖而出。

lg888的博客 1088

Java 异常链

异常链是一种面向对象编程技术,指将捕获的异常包装进一个新的异常中并重新抛出的异常处理方式。原异常被保存为新异常的一个属性(比如cause)。这个想法是指一个方法应该抛出定义在相同的抽象层次上的异常,但不会丢弃更低层次的信息。通过异常链,可以将原始异常信息传递给调用者,便于定位和排查问题。例如,播放视频文件的方法可能捕获读取文件过程中的异常,将其包装在新抛出的播放视频文件的异常中。用户界面部分不需要知道读取字节块、eof()调用或其他操作时发生的错误,这是意外的文件结尾、读取错误或者其他的错误;

不安分的猿人的专栏 475

python提取图片中的文字写入excel文件,并打包为exe可执行文件

python提取图片中的文字写入excel文件,并打包为exe可执行文件

liqiang12689的博客 989

解决ADS1.2报错Cannot obtain license

报错如下 将licenses文件下的license内容进行修改: 修改为如下内容即可。 # # Generated on 2021-dec-1 by licwizard # PACKAGE ads armlmd 1.200 E32F0DE5161D COMPONENTS="armasm compiler bats armulate axd adwu fromelf armlink codewarrior armsd" INCREMENT ads armlmd 1.200 permanent uncounte

qq_46110320的博客 3461

java各种异常总结

java各种异常总结

linsa_pursuer的博客 3931

Centos7搭建OpenStack+创建iaas云主机

主要说明在控制节点和计算节点上,通过脚本的形式,安装OpenStack的iaas安装步骤和创建可运行的云主机。提供实施简单、可大规模扩展、丰富、标准统一的云计算管理平台。

weixin_48218106的博客 1万+

什么是Java中的异常链,如何使用异常链来处理异常信息?

在main()方法中,我们调用了getData()方法,并尝试处理可能抛出的异常。如果getData()方法抛出了异常,我们使用catch块捕获该异常,并使用handleException()方法处理异常。如果有,我们使用handleException()方法继续向上查找引发该异常的异常,直到找到引发异常的源头。Java中的异常链是一种用于处理异常的技术,它允许您在捕获一个异常时继续向上查找引发该异常的异常。使用异常链,你可以在捕获一个异常时,继续向上查找引发该异常的异常,直到找到引发异常的源头。

scjrw的博客 800

基于STM32+华为云IOT设计的云平台监控系统_102

本次设计结合现代生活的具体需求,设计出一套基于华为云IOT设计的云平台监控系统,可以远程实时查看家里光照强度、温湿度等信息,支持在云端控制家里的电器设备,实现远程控制。

7642

Python爬虫:抓取专利数据并分析专利趋势

本文展示了如何使用 Python 爬虫技术抓取中国专利数据,并对数据进行了清洗、分析和趋势预测。通过分析专利数据,企业和科研机构可以了解行业的技术发展趋势,进行技术创新战略规划。未来,我们可以进一步扩展爬虫的功能,抓取更多专利数据,增加多维度的数据分析,如技术领域、地域分布等。同时,可以尝试使用深度学习模型(如 LSTM)进行时间序列预测,以获得更准确的专利趋势预测。

2201_76125261的博客 1785

java 异常信息_java异常信息丢失问题

java异常信息丢失问题在讲述java异常丢失问题之前,先简略的介绍一下java异常处理机制。在这里,为了防止谬解它我不得不引用理论来先说明一下什么java异常处理机制,之后再提及自身对该机制的理解。异常情形(exceptional condition):阻止当前方法或作用域继续执行的问题。而异常处理机制就是提供一种当异常情形发生时有效解决这种异常问题的方法。貌似一句很简单的话,若要很好的应用它着...

weixin_26857669的博客 557

【好玩的游戏项目】使用Docker快速部署属于你的RPG网页小游戏

【好玩的游戏项目】使用Docker快速部署属于你的RPG网页小游戏

jks212454的博客 5572

java异常丢失_java异常链的使用及异常丢失

定义三个异常类:ExceptionA,ExceptionB,ExceptionC?public class ExceptionA extends Exception {public ExceptionA(String str) {super();}}public class ExceptionB extends ExceptionA {public ExceptionB(String str) {...

weixin_39928106的博客 165

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

java信息丢失_java异常丢失及异常链

1.Java中异常丢失的情况:先定义三个异常:public class ExceptionA extendsException {publicExceptionA(String str) {super();}}public class ExceptionB extendsExceptionA {publicExceptionB(String str) {super(str);}}public cl...

weixin_32282271的博客 446

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

java异常丢失及异常链

 1.Java中异常丢失的情况:   先定义三个异常: public class ExceptionA extends Exception { public ExceptionA(String str) { super(); } } public class ExceptionB extends ExceptionA { pu...

weixin_34334744的博客 169

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Java异常十三:异常链,异常链常见问题

1.异常链 一个异常链的简单示例: public class TryDemFive { public static void main(String[] args) { try { testThree(); } catch (Exception e) { e.printStackTrace(); } } public static void testOne() throws HotelAgeException{ // testOne()方法抛出了Hot

小枯林的博客 758

java异常:异常链简介

异常链:有时候我们会捕获一个异常后再抛出另一个异常 顾名思义就是将异常发生的原因一个传一个串起来,即把底层的异常信息传给上层,这样逐层抛出。 定义testOne,testTwo,testThree方法,testTwo对testOne抛出的异常进行捕获,testThree对testTwo抛出的异常进行捕获: package java_exception; public class TryDemoFive { public static void main(String[] args) {

Thumb_的博客 2137

异常链

异常链概念 有时候我们会捕获一个异常后抛出另外一个异常,顾名思义,就是将异常产生的原因一个一个串起来,将底层的异常信息传递给上层,这样逐层抛出。 以下代码的功能就是这样, package cn.hpu.test; public class TryDemoFive { public static void main(String[] args) { // TODO Auto-gen...

ll123c的博客 154

java 调c catch 异常_简单谈谈java的异常处理(Try Catch Finally)

异常的英文单词是exception,字面翻译就是“意外、例外”的意思,也就是非正常情况。事实上,异常本质上是程序上的错误,包括程序逻辑错误和系统错误。一 前言java异常处理大家都不陌生,总的来说有下面两点:1.抛出异常:throw exceptionclass SimpleException{public void a() throws Exception{throw new Exception...

weixin_42529366的博客 240

Java 异常(Exception)

异常1. 重抛异常2. 异常链 1. 重抛异常 重新抛出异常会把异常抛给上一级环境中的异常处理程序,同一个try块的后续catch子句将被忽略,此外,异常对象的所有信息都得以保持,所以高一级环境中捕获此异常的处理程序可以从这个异常对象中得到所有信息。 如果只是把当前异常对象重新抛出,那么printStackTrace()方法显示的将是原来异常抛出点的调用栈信息,而并非重新抛出点的信息,要想更新这个信息,可以调用fillInStackTrace()方法,将返回一个Throwable对象,它是通过把当前调用栈信

qq_41133155的博客 240

Java的异常类在使用时有哪些坑?

异常类使用时的坑 在catch中捕获到异常然后再把该异常重新抛出,则外层的catch捕获到的还是最原始的那个异常对象,如果在内部catch中,对异常对象调用 fillInStackTrace()方法,则调用这个方法的那一行变成了异常的新发生地。如,(看一下这两个throw的区别) 想要在捕获到一个异常后抛出另一个异常,并且希望保留下原始的异常信息,这就是异常链。要实现异常链,Erro...

绕行的专栏 407

Think in Java 异常类(第12章) 读书笔记

概念: 首先看一下Java中的异常体系: Error:一般是指与虚拟机相关的问题,如 OOM,ThreadDeath。 RuntimeExprion:NullPointerException,ClassCastException,IllegalArgumentException,ArrayStoreException,IndexOutOfBoundsException,Num...

ltx0720的博客 352

Java 异常处理的十个建议

一、尽量不要使用e.printStackTrace(),而是使用log打印。 反例: try{ // do what you want }catch(Exception e){ e.printStackTrace(); } 复制代码 正例: try{ // do what you want }catch(Exception e){ log.info("你的程序有异常啦,{}",e); } 复制代码 理由: printStackTrace()打印出的堆栈日志跟业务代码日

javajavajava 622

Milvus Java SDK 重试机制内部错误可见性优化解析

在分布式向量数据库Milvus的Java客户端使用过程中,开发者发现当启用重试机制时,系统仅会返回"Retry run out of X retry times"的通用异常信息,而原始错误原因被完全隐藏。这给问题排查带来了很大困难,特别是在生产环境中需要快速定位底层故障原因时。 ## 技术原理分析 Milvus Java SDK的重试机制位于MilvusServiceClient类中,其设计初衷...

gitblog_07877的博客 537

java异常那些事

为什么需要异常机制: Java的基本理念是“结构不佳的代码不能运行” --- Java编程思想 最理想的是在编译时期就发现错误,但一些错误要在运行时才会暴露出来。对于这些错误我们当然不能置之不理。对于错误而言的两个关键是发现和处理错误。Java提供了统一的异常机制来发现和处理错误。 不考虑异常存在来看一下这个场景: public void...

weixin_34032779的博客 182
上一篇: Java集合类
下一篇: finally在try和catch块以及return中的执行顺序
牧竹子
博客等级 码龄17年 572粉丝 233原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值