SpringBoot--打印详细空指针异常的工具类

原文网址:SpringBoot--打印详细空指针异常的工具类_IT利刃出鞘的博客-CSDN博客

简介

说明

        本文介绍打印详细异常堆栈的工具类。

        本工具类可以打印详细的异常堆栈的信息。比如:在抛出NullPointException时,message是这样的:java.lang.NullPointException。用本工具可以获得方法的调用流程,方便排查问题。

优点

异常信息很详细。

代码

package com.knife.util;
 
/**
 * 异常信息工具类
 */
public class ThrowableUtil {
    private static final int DEFAULT_LINE_NUMBER = 10;
    
    /**
     * 获取所有堆栈信息
     *
     * @param e 异常
     * @return 堆栈信息
     */
    public static String getStackTrace(Throwable e) {
        StringBuilder s = new StringBuilder().append(e);
        for (StackTraceElement traceElement : e.getStackTrace()) {
            s.append("\r\n    at ").append(traceElement);
        }
        return s.toString();
    }

    /**
     * 获取最后lineNumber条堆栈信息
     *
     * @param e 异常对象
     * @param lineNumber 最后lineNumber条
     * @return 错误信息
     */
    public static String getLastStackTrace(Throwable e, Integer lineNumber) {
        Integer tmpLineNumber = lineNumber;
        if (tmpLineNumber == null) {
            tmpLineNumber = DEFAULT_LINE_NUMBER;
        }

        StringBuilder s = new StringBuilder().append(e);
        int i = 0;
        for (StackTraceElement traceElement : e.getStackTrace()) {
            s.append("\r\n    at ").append(traceElement);
            if (i >= tmpLineNumber) {
                break;
            }
            i++;
        }
        return s.toString();
    }

    /**
     * 获取以指定包名为前缀的所有堆栈信息
     *
     * @param e             异常
     * @param packagePrefix 包前缀
     * @return 堆栈信息
     */
    public static String getStackTraceByPackage(Throwable e, String packagePrefix) {
        StringBuilder s = new StringBuilder().append(e);

        for (StackTraceElement traceElement : e.getStackTrace()) {
            // 如果是指定的包
            if (traceElement.getClassName().startsWith(packagePrefix)) {
                s.append("\r\n    at ").append(traceElement);
            }
        }
        return s.toString();
    }

    /**
     * 获取以指定包名为前缀的最后lineNumber条堆栈信息
     *
     * @param e             异常
     * @param packagePrefix 包前缀
     * @param lineNumber    最后lineNumber条
     * @return 堆栈信息
     */
    public static String getLastStackTraceByPackage(Throwable e, String packagePrefix, Integer lineNumber) {
        Integer tmpLineNumber = lineNumber;
        if (tmpLineNumber == null) {
            tmpLineNumber = DEFAULT_LINE_NUMBER;
        }

        StringBuilder s = new StringBuilder().append(e);
        int i = 0;
        for (StackTraceElement traceElement : e.getStackTrace()) {
            // 如果是指定的包
            if (traceElement.getClassName().startsWith(packagePrefix)) {
                s.append("\r\n    at ").append(traceElement);
            }
            if (i >= tmpLineNumber) {
                break;
            }
            i++;
        }
        return s.toString();
    }

    /**
     * 获取最后lineNumber行简略堆栈信息(方法名加行号)
     *
     * @param e 异常对象
     * @param lineNumber 最后lineNumber行
     * @return 错误信息
     */
    public static String getBriefLastStackTrace(Throwable e, Integer lineNumber) {
        Integer tmpLineNumber = lineNumber;
        if (tmpLineNumber == null) {
            tmpLineNumber = DEFAULT_LINE_NUMBER;
        }

        StringBuilder s = new StringBuilder().append(e);
        int i = 0;
        for (StackTraceElement traceElement : e.getStackTrace()) {
            String info = traceElement.getMethodName() + ":" + traceElement.getLineNumber();

            s.append("\r\n    at ").append(info);
            if (i >= tmpLineNumber) {
                break;
            }
            i++;
        }
        return s.toString();
    }

    /**
     * 获取以指定包名为前缀的所有简略堆栈信息(方法名+包名)
     *
     * @param e             异常
     * @param packagePrefix 包前缀
     * @return 堆栈信息
     */
    public static String getBriefStackTraceByPackage(Throwable e, String packagePrefix) {
        StringBuilder s = new StringBuilder().append(e);

        for (StackTraceElement traceElement : e.getStackTrace()) {
            // 如果是指定的包
            if (traceElement.getClassName().startsWith(packagePrefix)) {
                String info = traceElement.getMethodName() + ":" + traceElement.getLineNumber();
                s.append("\r\n    at ").append(info);
            }
        }
        return s.toString();
    }

    /**
     * 获取以指定包名为前缀的最后lineNumber行简略堆栈信息(方法名+包名)
     *
     * @param e             异常
     * @param packagePrefix 包前缀
     * @param lineNumber    获取前lineNumber行输出
     * @return 堆栈信息
     */
    public static String getLastBriefStackTraceByPackage(Throwable e, String packagePrefix, Integer lineNumber) {
        Integer tmpLineNumber = lineNumber;
        if (tmpLineNumber == null) {
            tmpLineNumber = DEFAULT_LINE_NUMBER;
        }

        StringBuilder s = new StringBuilder().append(e);
        int i = 0;
        for (StackTraceElement traceElement : e.getStackTrace()) {
            // 如果是指定的包
            if (traceElement.getClassName().startsWith(packagePrefix)) {
                String info = traceElement.getMethodName() + ":" + traceElement.getLineNumber();
                s.append("\r\n    at ").append(info);
            }
            if (i >= tmpLineNumber) {
                break;
            }
            i++;
        }
        return s.toString();
    }
}

用法

try{
    ...
} catch(Exception e) {
    e.printStackTrace();
    String errorMessage = ThrowableUtil.getLastStackTrace(e, 10);
    
    // 这里可以将errorMessage返回给前端
}

猜你喜欢

转载自blog.csdn.net/feiying0canglang/article/details/126679599