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

2023-10-24 21:20

本文主要是介绍Java中获取异常栈中的底层异常信息-分析Java异常栈,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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 exceptionmethod2();} catch (Exception e) {throw new Exception("Exception in method2", e);}}public static void method2() throws Exception {// some code that may throw an exceptionthrow new Exception("Stack bottom exception message");}
}

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

java.lang.Exception: Exception in method1at 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 method2at 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 messageat 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,说明已经遍历到了异常栈的栈底,从而获取到栈底的最开始的异常信息。

这篇关于Java中获取异常栈中的底层异常信息-分析Java异常栈的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/277816

相关文章

Python获取中国节假日数据记录入JSON文件

《Python获取中国节假日数据记录入JSON文件》项目系统内置的日历应用为了提升用户体验,特别设置了在调休日期显示“休”的UI图标功能,那么问题是这些调休数据从哪里来呢?我尝试一种更为智能的方法:P... 目录节假日数据获取存入jsON文件节假日数据读取封装完整代码项目系统内置的日历应用为了提升用户体验,

微信公众号脚本-获取热搜自动新建草稿并发布文章

《微信公众号脚本-获取热搜自动新建草稿并发布文章》本来想写一个自动化发布微信公众号的小绿书的脚本,但是微信公众号官网没有小绿书的接口,那就写一个获取热搜微信普通文章的脚本吧,:本文主要介绍微信公众... 目录介绍思路前期准备环境要求获取接口token获取热搜获取热搜数据下载热搜图片给图片加上标题文字上传图片

Java编译生成多个.class文件的原理和作用

《Java编译生成多个.class文件的原理和作用》作为一名经验丰富的开发者,在Java项目中执行编译后,可能会发现一个.java源文件有时会产生多个.class文件,从技术实现层面详细剖析这一现象... 目录一、内部类机制与.class文件生成成员内部类(常规内部类)局部内部类(方法内部类)匿名内部类二、

Go标准库常见错误分析和解决办法

《Go标准库常见错误分析和解决办法》Go语言的标准库为开发者提供了丰富且高效的工具,涵盖了从网络编程到文件操作等各个方面,然而,标准库虽好,使用不当却可能适得其反,正所谓工欲善其事,必先利其器,本文将... 目录1. 使用了错误的time.Duration2. time.After导致的内存泄漏3. jsO

SpringBoot实现数据库读写分离的3种方法小结

《SpringBoot实现数据库读写分离的3种方法小结》为了提高系统的读写性能和可用性,读写分离是一种经典的数据库架构模式,在SpringBoot应用中,有多种方式可以实现数据库读写分离,本文将介绍三... 目录一、数据库读写分离概述二、方案一:基于AbstractRoutingDataSource实现动态

Springboot @Autowired和@Resource的区别解析

《Springboot@Autowired和@Resource的区别解析》@Resource是JDK提供的注解,只是Spring在实现上提供了这个注解的功能支持,本文给大家介绍Springboot@... 目录【一】定义【1】@Autowired【2】@Resource【二】区别【1】包含的属性不同【2】@

springboot循环依赖问题案例代码及解决办法

《springboot循环依赖问题案例代码及解决办法》在SpringBoot中,如果两个或多个Bean之间存在循环依赖(即BeanA依赖BeanB,而BeanB又依赖BeanA),会导致Spring的... 目录1. 什么是循环依赖?2. 循环依赖的场景案例3. 解决循环依赖的常见方法方法 1:使用 @La

Java枚举类实现Key-Value映射的多种实现方式

《Java枚举类实现Key-Value映射的多种实现方式》在Java开发中,枚举(Enum)是一种特殊的类,本文将详细介绍Java枚举类实现key-value映射的多种方式,有需要的小伙伴可以根据需要... 目录前言一、基础实现方式1.1 为枚举添加属性和构造方法二、http://www.cppcns.co

Elasticsearch 在 Java 中的使用教程

《Elasticsearch在Java中的使用教程》Elasticsearch是一个分布式搜索和分析引擎,基于ApacheLucene构建,能够实现实时数据的存储、搜索、和分析,它广泛应用于全文... 目录1. Elasticsearch 简介2. 环境准备2.1 安装 Elasticsearch2.2 J

Java中的String.valueOf()和toString()方法区别小结

《Java中的String.valueOf()和toString()方法区别小结》字符串操作是开发者日常编程任务中不可或缺的一部分,转换为字符串是一种常见需求,其中最常见的就是String.value... 目录String.valueOf()方法方法定义方法实现使用示例使用场景toString()方法方法