背景

在开发Java应用程序的时候,遇到程序抛异常,我们通常会把抛异常时的运行时环境保存下来(写到日志文件或者在控制台中打印出来)。这样方便后续定位问题。

需要记录的运行时环境包含两部分内容:抛异常时的参数信息和函数调用堆栈。针对堆栈信息,如果直接调用Exception的getStackTrace方法获取将得到这样一句没用的信息:

 [Ljava.lang.StackTraceElement;@4361bd48

我们希望能打印完整的调用堆栈,像这样:

 com.elon.FileNoExistException at com.elon.StaruptService.throwException(StaruptService.java:21)
 at com.elon.StaruptService.main(StaruptService.java:9)

方案

提供一个静态公有方法用于获取异常的堆栈信息。将堆栈作为异常信息的一部分输出到日志文件或者打印到控制台界面。

步骤一:创建一个Demo项目

步骤二:编写样例代码

1、获取异常堆栈的公共方法:

 package com.elon;

 import java.io.PrintWriter;
 import java.io.StringWriter;

 public class UtilTool
 {
     /**
      * 获取异常的调用堆栈信息。
      *
      * @return 调用堆栈
      */
     public static String toStackTrace(Exception e)
     {
         StringWriter sw = new StringWriter();
         PrintWriter pw = new PrintWriter(sw);

         try
         {
             e.printStackTrace(pw);
             return sw.toString();
         }
         catch(Exception e1)
         {
             return "";
         }
     }
 }

2、增加一个判断文件不存在时抛出的异常:

 package com.elon;

 /**
  * 自定义的文件不存在异常。
  *
  * @author elon
  */
 public class FileNoExistException extends Exception
 {
     private static final long serialVersionUID = 7929453457697405891L;

     /**
      * 文件完整路径
      */
     private String filePath;

     /**
      * 构造函数。初始化文件路径。
      *
      * @param filePath 文件路径
      */
     public FileNoExistException(String filePath)
     {
         this.filePath = filePath;
     }

     public String getExceptionMsg()
     {
         return "filePath:" + filePath + "|exception trace:" + UtilTool.toStackTrace(this);
     }
 }

3、打印异常信息:

 public class StaruptService
 {
     public static void main(String[] args)
     {
         try
         {
             FileNoExistException e = throwException();
         }
         catch (FileNoExistException e)
         {
             System.out.println(e.getExceptionMsg());
         }
     }

     private static FileNoExistException throwException() throws FileNoExistException
     {
         throw new FileNoExistException("D:/123.xlsx");
     }
 } 

测试打印结果

 filePath:D:/123.xlsx|exception trace:com.elon.FileNoExistException at com.elon.StaruptService.throwException(StaruptService.java:19)
 at com.elon.StaruptService.main(StaruptService.java:9)

打印Java异常堆栈信息的更多相关文章

  1. 利用Xposed Hook打印Java函数调用堆栈信息的几种方法

    本文博客链接:http://blog.csdn.net/QQ1084283172/article/details/79378374 在进行Android逆向分析的时候,经常需要进行动态调试栈回溯,查看 ...

  2. [Java]借助PrintWriter类和StringWriter类,取出异常堆栈信息放入字符串中

    在程序开发中,有时我们不仅需要将异常堆栈信息打印在控制台里或是log里,可能还需要将它存在String中,再送到合适的地方,如错误页面,数据库等. 要取异常堆栈信息,具体的函数就是: /** * Ge ...

  3. 写给大忙人的ELK最新版6.2.4学习笔记-Logstash和Filebeat解析(java异常堆栈下多行日志配置支持)

    接前一篇CentOS 7下最新版(6.2.4)ELK+Filebeat+Log4j日志集成环境搭建完整指南,继续对ELK. logstash官方最新文档https://www.elastic.co/g ...

  4. ELK学习笔记之Logstash和Filebeat解析对java异常堆栈下多行日志配置支持

    0x00 概述 logstash官方最新文档.假设有几十台服务器,每台服务器要监控系统日志syslog.tomcat日志.nginx日志.mysql日志等等,监控OOM.内存低下进程被kill.ngi ...

  5. 【Java】 NullPointerException、ArrayIndexOutOfBoundsException、ClassCastException、ArrayIndexOutOfBoundsException、ArrayStoreException、ArithmeticException等没有异常堆栈信息

    今天工作中,临时Fix一个bug,一看日志“java.lang.ClassCastException: null”相当懵逼,没有详细堆栈信息,这咋整.虽然根据上下文可以推测代码的大致位置,但不敢拍板确 ...

  6. 在java中捕获异常时,使用log4j打印出错误堆栈信息

    当java捕获到异常时,把详细的堆栈信息打印出来有助于我们排查异常原因,并修复相关bug,比如下面两张图,是打印未打印堆栈信息和打印堆栈信息的对比: 那么在使用log4j输出日志时,使用org.apa ...

  7. kill -3 PID命令获取java应用堆栈信息

    一.应用场景: 当linux服务器出现异常情况(响应缓慢,负载持续飙升)并且服务器没有安装对应的包而无法使用jstack等命令时,可以使用linux的kill相关命令打印堆栈信息. 命令格式:kill ...

  8. JVM参数OmitStackTraceInFastThrow:不打印NullPointerException异常堆栈

    查看线上日志,遇到一个诡异的问题,就是系统大量空指针的异常,但是没有打印堆栈,导致不方便定位问题. 经过一番代码调试,确定并非程序代码问题.没有线索之后,从Google找到了答案:是因为在server ...

  9. SpringBoot-技术专区-详细打印启动时异常堆栈信息

    SpringBoot在项目启动时如果遇到异常并不能友好的打印出具体的堆栈错误信息,我们只能查看到简单的错误消息,以致于并不能及时解决发生的问题,针对这个问题SpringBoot提供了故障分析仪的概念( ...

随机推荐

  1. angularjs ng-csv 异步下载

    相信之前我们 前端下载csv的时候 都是通过后台代码 生成文件,然后发送给前台 文件路径来进行下载,下面介绍一下angular1 ng-csv下载 csv数据(这种不通过后台代码来实现的前台下载) 参 ...

  2. Mybatis 动态使用update语句

    update pf_product_audio_t <trim prefix="set" suffixOverrides=","> <if t ...

  3. 记录一则fsck的简单案例

    环境:RHEL 6.5 + ext4文件系统 我个人实验环境的一个虚拟机,开机时在Checking filesystems时,有报错: /dev/mapper/vg_linuxbase-lv_root ...

  4. Python3实现QQ机器人自动爬取百度文库的搜索结果并发送给好友(主要是爬虫)

    一.效果如下: 二.运行环境: win10系统:python3:PyCharm 三.QQ机器人用的是qqbot模块 用pip安装命令是: pip install qqbot (前提需要有request ...

  5. 如何在CentOS 7上部署Google BBR【搬运、机翻】

    如何在CentOS 7上部署Google BBR 本文章搬运自 https://www.vultr.com/docs/how-to-deploy-google-bbr-on-centos-7 [注:文 ...

  6. 2018/3/2晚11点30分写的程序(C++)

    程序目标:输入一个字符串,竖向输出该字符串.使用string和动态分配内存机制.代码如下: #include<iostream>#include "stdafx.h"# ...

  7. java Socket实现简单在线聊天(一)

    最近的项目有一个在线网页交流的需求,由于很久以前做过的demo已经忘记的差不多了,因此便重新学习一下. 我计划的大致实现步骤分这样几大步: 1.使用awt组件和socket实现简单的单客户端向服务端持 ...

  8. FusionCharts MSBar3D图

    1.静态页面 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> ...

  9. VS2008下QT开发环境搭建(转)

    原博文地址:http://blog.csdn.net/sunnyboycao/article/details/6364444 VS2008集成QT4.7.2环境搭建 作者:jimmy 日期:2011- ...

  10. Error Code: 1175. You are using safe update mode and you tried to update a table

    错误描述 11:14:39 delete from t_analy_yhd Error Code: 1175. You are using safe update mode and you tried ...