Java中获取异常栈中的底层异常信息-分析Java异常栈

news2024/10/2 16:29:51

Java中获取异常栈中的底层异常信息-分析Java异常栈

首先,我们准备好一个多层异常栈堆叠的示例代码:

public class ExceptionUtils {
    public static void main(String[] args) {
        try {
            buildMultiLayerExceptionStack();
        }  catch (Exception e) {
            e.printStackTrace();

            // 获取最底层的堆栈异常信息
            Throwable throwable = e;
            while (throwable != null) {
                Throwable nextCause = throwable.getCause();
                if (nextCause == null) {
                    System.out.println("root exception message: " + throwable.getMessage());
                    break;
                }
                throwable = nextCause;
            }

        }
    }

    public static void buildMultiLayerExceptionStack() throws Exception {
        try {
            method1();
        } catch (Exception e) {
            throw new Exception("Exception in method1", e);
        }
    }

    public static void method1() throws Exception {
        try {
            // some code that may throw an exception
            method2();
        } catch (Exception e) {
            throw new Exception("Exception in method2", e);
        }
    }

    public static void method2() throws Exception {
        // some code that may throw an exception
        throw new Exception("Stack bottom exception message");
    }
}

buildMultiLayerExceptionStack方法中,我们构造了一个多层嵌套的Exception异常信息栈,得到的异常栈结构如下所示:

java.lang.Exception: Exception in method1
	at com.netease.mail.data.test.ExceptionUtils.buildMultiLayerExceptionStack(ExceptionUtils.java:35)
	at com.netease.mail.data.test.ExceptionUtils.main(ExceptionUtils.java:12)
Caused by: java.lang.Exception: Exception in method2
	at com.netease.mail.data.test.ExceptionUtils.method1(ExceptionUtils.java:44)
	at com.netease.mail.data.test.ExceptionUtils.buildMultiLayerExceptionStack(ExceptionUtils.java:33)
	... 1 more
Caused by: java.lang.Exception: Stack bottom exception message
	at com.netease.mail.data.test.ExceptionUtils.method2(ExceptionUtils.java:50)
	at com.netease.mail.data.test.ExceptionUtils.method1(ExceptionUtils.java:42)
	... 2 more

如果我们想获取到最底层的真实异常信息,也就是Caused by: java.lang.Exception: Stack bottom exception message 这条异常信息,来提示告警下发,要怎么做呢?

首先在debug模式下,我们先观察一下这个Exception的异常栈结构:

在这里插入图片描述

打开后可以观察到,栈底异常信息的cause属性似乎是在不断的嵌套重复。那此时,如果不停的调用e.getCause来获取每个异常的Cause属性的话,岂不是不会结束了吗?

针对这个问题,我们来看下e.getCause的源码:

    public synchronized Throwable getCause() {
        return (cause==this ? null : cause);
    }

看到了吗,java底层本身就给了我们解决方法,在调用e.getCause方法时,会判断cause属性与当前的Throwable异常是否为同一对象,如果是则会返回null。

因此,我们只需要在不停调用e.getCause来层层递进获取栈底异常信息时,判断是否得到的Cause为Null,即可判断是否已经调用到了异常栈的栈底。

有了上面的结论,我们就可以得到下面的代码来获取异常栈的栈底异常信息:

        try {
            buildMultiLayerExceptionStack();
        }  catch (Exception e) {
            e.printStackTrace();

            // 获取最底层的堆栈异常信息
            Throwable throwable = e;
            while (throwable != null) {
                Throwable nextCause = throwable.getCause();
                if (nextCause == null) {
                    System.out.println("root exception message: " + throwable.getMessage());
                    break;
                }
                throwable = nextCause;
            }

        }
    }

上面的代码中,利用while循环对异常栈进行遍历,调用throwable.getCause()来获取每个异常栈的上一层异常信息(也就是造成当前异常的Cause)。直到判断得到的上一层异常为Null,说明已经遍历到了异常栈的栈底,从而获取到栈底的最开始的异常信息。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1128689.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

RHCE---shell 条件测试

文章目录 目录 文章目录 前言 一.条件测试 概述: 文件测试 整数测试: 总结 前言 当我们完成某一命令的编写时,除了观察输出的内容,我们又如何得知命令是否执行成功呢? 这里,我们需要用到条件测试 一.条…

SEO内链优化的8个终极策略

网站SEO优化主要分为两个大类,一类是站外优化,另一类是站内优化。站内优化的内链建设优化是SEO优化工作的重中之重,可以视为网站内部的内功修炼之一。本文将介绍什么是内链以及如何通过内链优化来提升SEO排名。 什么是内链? 内链…

ArrayList与List的层级关系及ArrayList解析

List与ArrayList的关系 List List是一个接口,不能直接实例化。如果要使用必须去实例化List的实现类——ArrayList和LinkedList站在数据结构的角度看,List就是一个线性表。常见的线性表:顺序表、链表、栈、队列等 线性表 线性表是n个具有相…

解决SpringBoot整合Activiti引用JPA:缺少javax.persistence.EntityManagerFactory

系统接入工作流Activiti的时候,发现activiti初始化表,操作数据库使用的是jpa,我们这里解决办法就是引入spring-data-jpa-starter自动配置EntityManagerFactory。 首先把工作流sql文件执行 基础依赖jar引入 这里忽略Activiti的基础依赖,以下…

什么是云原生?土生土长?

“云原生”(Cloud Native)是一种构建和运行应用程序的方法,这种方法充分利用了云计算的优势。云原生应用程序是为云环境设计的,通常是在容器中运行,并被设计为在微服务架构中运行,这使得它们能够快速扩展和…

进公司第二天:绿盾+TFS拉取代码

1.配置绿盾 绿盾:一种安全软件 遇到的问题 TFS端口号:192.168.3.231 服务端口号:默认(千万别瞎写啥的) 2.配置TFS拉取代码 TFS利用插件 ,输入公司给你的信息你的各种信息 拉取代码就行。 3.查看代码 —…

系统架构师备考倒计时12天(每日知识点)

1. 基于架构的软件设计(ABSD) (ABSD方法是架构驱动,即强调由业务【商业】、质量和功能需求的组合驱动架构设计。ABSD方法有三个基础。第一个基础是功能的分解。在功能分解中,ABSD方法使用已有的基于模块的内聚和耦合技术;第二个基…

上位机通过Modbus转Profinet网关与变频器Modbus通讯配置案例

上位机与变频器Modbus通讯是通过Modbus转Profinet网关来实现的。这个网关可以理解为一个通信翻译器,负责将上位机通过Modbus协议发送的数据转换为Profinet协议,再通过Profinet网络与变频器进行通信。 上位机通过Modbus转Profinet网关与变频器Modbus通讯&…

一些基本图像预处理---将一个文件中的所有图片进行尺度归一化、查看每个像素的RGB值,将指定颜色切换为白色、将文件中所有图片从png到jpg的切换

目录 1.将一个文件中的所有图片进行尺度归一化 2. 查看一张图片的每个像素的RGB值 3.将指定颜色切换成其他颜色(代码中将红色切换为白色) 4.将一个文件中所有图片从png到jpg的切换 5.将一个文件夹中的所有图像重命名从1开始 1.将一个文件中的所有图…

java--switch语句

1.switch语句 是通过比较值来决定执行那条分支。 2.switch分支的执行流程 ①先执行表达式的值,再拿着这个值去与case后的值进行匹配。 ②与那个case后的值匹配为true就执行那个case块的代码,遇到break就跳出switch分支。 ③如果全部case后的值与之匹…

睿趣科技:抖音小店申请流程

随着移动互联网的发展,越来越多的人开始尝试通过开设网店来创业。抖音作为国内最受欢迎的短视频平台之一,也推出了自己的电商功能——抖音小店。那么,如何申请抖音小店呢?下面就为大家详细介绍一下抖音小店的申请流程。 首先,打开…

powerdesigner下载安装教程

1、什么是PowerDesigner PowerDesigner是Sybase公司的CASE工具集,使用它可以方便地对管理信息系统进行分析设计,它几乎包括了数据库模型设计的全过程。利用PowerDesigner可以制作数据流程图、概念数据模型(ConceptualDataModel)、…

从语言层面了解线程(std::thread)使用的里里外外

从语言层面了解线程(std::thread)使用的里里外外 使用 C标准库提供的 std::thread,配合 std::mutex、std::condition_variable 等工具可以很方便地编写并发程序。C标准库针对不同的操作系统中并发编程相关的系统调用做了很好的封装,提供了非常简洁易用的…

html iframe 框架有哪些优缺点?

目录 前言: 用法: 理解: 优点: 嵌套外部内容: 独立性: 分离安全性: 跨平台兼容性: 方便维护: 缺点: 性能开销: 用户体验问题&#xf…

智慧公厕:打造更美好的城市生活环境

在信息技术迅猛发展的今天,智慧公厕作为一种创新的城市管理模式,正逐渐受到人们的关注。以物联网、大数据、人工智能为基础,智慧公厕正逐步改变传统公厕的面貌,为城市居民提供更便捷、舒适的公共服务。本文将以智慧公厕源头厂家广…

登福布斯小企业推荐邮箱供应商榜单:高效沟通,轻松管理

近日,知名财经网站福布斯发布了一份针对小企业的推荐邮箱供应商名单 ,其中Zoho Mail企业邮箱凭借其卓越的产品特性和优质的客户服务成功上榜。 Zoho Mail企业邮箱是由印度科技公司Zoho Corporation研发的一款全功能电子邮件和协作平台,在中国…

C++基础语法——C++11

目录 1. 统一的列表初始化 ①{}进行初始化 ②std::initializer_list 1.类型 2.使用场景 2.声明 ①auto ②decltype ③nullptr 3.范围for 4.右值引用与移动语义 ①左值引用与右值引用 ②左值引用与右值引用的比较 ③左值引用与右值引用的使用场景与意义、移动语义…

Python算法练习 10.24

leetcode 199 二叉树的深度 给定一个二叉树的 根节点 root,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。 示例 1: 输入: [1,2,3,null,5,null,4] 输出: [1,3,4]示例 2: 输入: [1,null,3] 输出: [1,3]示例 3: 输…

统计学习方法 支持向量机(上)

文章目录 统计学习方法 支持向量机(上)线性可分支持向量机与硬间隔最大化定义硬间隔最大化对偶算法 线性支持向量机与软间隔最大化定义软间隔最大化对偶算法合页损失函数 统计学习方法 支持向量机(上) 读李航的《统计学习方法》中…

分区操作系统

简单介绍 什么是分区 首次提出于ARINC 653标准,它是航空领域的一个标准,定义了多分区操作系统的核心服务。 分区使得操作系统的各个功能模块(即每个分区)看起来好像都被分配了独立的处理器和外设,它们之间通过专线通…