java开发中找出隐藏的异常(解决异常定位)
程序员文章站
2022-07-10 18:53:06
1. 背景介绍在开发过程中, 遇到平台代码不规范的写法(如下图), 将异常直接吃掉, 或者吞掉了详细堆栈. 当生产运行到这段代码时, 抛出的信息非常少, 而且不知道是哪行代码抛出的异常, 排除问题非常困难. 为解决这个问题, 想到了一个好办法.2. 解决思路将jdk中的java.lang.Exception类重写. 在本机创建Exception这个类, 并在构造器中将堆栈输出package java.lang;public class Exception extends Throwabl...
1. 背景介绍
在开发过程中, 遇到平台代码不规范的写法(如下图), 将异常直接吃掉, 或者吞掉了详细堆栈. 当生产运行到这段代码时, 抛出的信息非常少, 而且不知道是哪行代码抛出的异常, 排除问题非常困难. 为解决这个问题, 想到了一个好办法.
2. 解决思路
- 将jdk中的java.lang.Exception类重写. 在本机创建Exception这个类, 并在构造器中将堆栈输出
package java.lang; public class Exception extends Throwable { static final long serialVersionUID = -3387516993124229948L; public Exception() { super(); this.printStackTrace(); // 将堆栈输出 } public Exception(String message) { super(message); this.printStackTrace(); } public Exception(String message, Throwable cause) { super(message, cause); this.printStackTrace(); } public Exception(Throwable cause) { super(cause); this.printStackTrace(); } protected Exception(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) { super(message, cause, enableSuppression, writableStackTrace); this.printStackTrace(); } }
- 通过javac命令将Exception.java构建, 得到Exception.class
- 再将Exception.class替换到$JAVA_HOME/jre/lib/rt.jar中的对应Execetion类
2. 验证
- 测试类
public class TestUserDefineNullPointerException { static void f1() { f2(); } private static void f2() { String s = null; s.length(); } public static void main(String[] args) { System.out.println("start..."); try { f1(); } catch (Exception e) { // 此处Exception虽然被吃了, 但控制台依然打出了异常堆栈 System.out.println("in.........."); } } }
- 控制台输出结果
in..........
at chapter4.TestUserDefineNullPointerException.f2(TestUserDefineNullPointerException.java:11)
at chapter4.TestUserDefineNullPointerException.f1(TestUserDefineNullPointerException.java:6)
at chapter4.TestUserDefineNullPointerException.main(TestUserDefineNullPointerException.java:18)
本文地址:https://blog.csdn.net/weixin_45244678/article/details/108265509