背景

在开发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. jstl c标签 ”test does not support runtime expressions“

    将jstl 的uri <%@ taglib prefix="c" uri="http://Java.sun.com/jstl/core" %>(没有 ...

  2. Laravel框架中Form表单Get请求搜索(在此感谢[https://simon8.com])

    首先看一下HTML部分的Form表单 <form role="search" method="get" id="searchform" ...

  3. UVALive - 4329 Ping pong 树状数组

    这题不是一眼题,值得做. 思路: 假设第个选手作为裁判,定义表示在裁判左边的中的能力值小于他的人数,表示裁判右边的中的能力值小于他的人数,那么可以组织场比赛. 那么现在考虑如何求得和数组.根据的定义知 ...

  4. nyoj234 吃土豆 01背包

    思路:假设我们先只考虑一行,规则就是取了i处的土豆,每一个土豆有两种选择,拿与不拿,那么i-1和i+1处的土豆都不能再取,那么要求某一行的最大取值就用一次动态规划即可,dp(i)表示前i个土豆能取得的 ...

  5. day1(变量、常量、注释、用户输入、数据类型)

    一.变量 name = "SmallNine" 等号前面是变量名(标识符),等号后面是变量值 变量的主要作用:就是把程序运算的中间结果临时存到内存里,已备后面的代码继续调用. 变量 ...

  6. LRUCache原理分析

    一.注释 LRUCache的原理,基本都在注释里面描述清楚了. /** * A cache that holds strong references to a limited number of va ...

  7. Linux sed 和 awk的用法

    sed用法: 原文链接:http://www.cnblogs.com/dong008259/archive/2011/12/07/2279897.html sed是一个很好的文件处理工具,本身是一个管 ...

  8. OpenStack Ironic 常见问题

    whole disk和partition 镜像 whole disk镜像部署可以支持windows,但是不能自定义分区(可以通过cloud-init实现),分区表是做镜像的人确定好的,partitio ...

  9. JavaScript基础教程1-20160612

    1.javascript是一门浏览器运行的脚本语言和java没关系 2.javascript语言写在哪里? (1)可以写单独的文件里面去调用(推荐采用此方法) index.html <head& ...

  10. 工作中常用的linux命令(1)

    1.cd :进入一个目录,例如进入/home/admin目录:cd /home/admin 2.pwd :查看当前所在目录:如图: 3.ls :列出当前目录下的所有文件: 4.ll :列出当前目录下的 ...