You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java中如何仅打印异常名称而非完整全限定类名

实现方式汇总

方案1:自定义异常类重写toString方法

如果业务中使用的是自定义异常,直接重写toString()方法即可,Throwable默认的toString()逻辑为全限定类名+错误信息,修改为仅获取简单类名:

public class MyBusinessException extends RuntimeException {
    // 保留原有构造方法
    public MyBusinessException(String message) {
        super(message);
    }

    @Override
    public String toString() {
        String s = getClass().getSimpleName();
        String message = getLocalizedMessage();
        return (message != null) ? (s + ": " + message) : s;
    }
}

测试时抛出该异常,打印结果就是不带包路径的格式。

方案2:通用异常信息格式化工具类

如果需要处理JDK内置异常、第三方依赖抛出的异常,可以写通用工具类手动格式化输出:

public class ExceptionLogUtils {
    /**
     * 格式化异常信息,仅返回简单类名+错误信息
     */
    public static String formatExceptionMessage(Throwable e) {
        if (e == null) {
            return "";
        }
        String simpleClassName = e.getClass().getSimpleName();
        String message = e.getLocalizedMessage();
        return message != null ? simpleClassName + ": " + message : simpleClassName;
    }

    /**
     * 完整格式化异常栈,类名均使用简单类名
     */
    public static String formatFullExceptionStack(Throwable e) {
        if (e == null) {
            return "";
        }
        StringBuilder sb = new StringBuilder(formatExceptionMessage(e));
        sb.append("\n");
        for (StackTraceElement element : e.getStackTrace()) {
            String fullClassName = element.getClassName();
            String simpleClassName = fullClassName.substring(fullClassName.lastIndexOf(".") + 1);
            sb.append("\tat ")
              .append(simpleClassName)
              .append(".")
              .append(element.getMethodName())
              .append("(")
              .append(element.getFileName())
              .append(":")
              .append(element.getLineNumber())
              .append(")\n");
        }
        // 递归处理异常原因
        Throwable cause = e.getCause();
        if (cause != null) {
            sb.append("Caused by: ").append(formatFullExceptionStack(cause));
        }
        return sb.toString();
    }
}

使用时直接调用对应方法获取格式化后的内容打印即可。

方案3:日志框架自定义转换器(生产环境推荐)

如果使用Logback、Log4j2等日志框架,可以自定义日志转换规则,全局生效无需修改业务代码,以下为Logback实现示例:

  1. 自定义转换器:
import ch.qos.logback.classic.pattern.ClassicConverter;
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.classic.spi.IThrowableProxy;
import ch.qos.logback.classic.spi.ThrowableProxy;

public class SimpleExceptionConverter extends ClassicConverter {
    @Override
    public String convert(ILoggingEvent event) {
        IThrowableProxy proxy = event.getThrowableProxy();
        if (proxy instanceof ThrowableProxy) {
            Throwable e = ((ThrowableProxy) proxy).getThrowable();
            return ExceptionLogUtils.formatFullExceptionStack(e);
        }
        return "";
    }
}
  1. 修改logback.xml配置,注册转换器并修改pattern:
<configuration>
    <!-- 注册自定义转换器 -->
    <conversionRule conversionWord="simpleEx" converterClass="com.yourpackage.SimpleExceptionConverter" />

    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <!-- 其他格式不变,异常部分用自定义的simpleEx代替默认的ex/throwable -->
            <pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n%simpleEx</pattern>
        </encoder>
    </appender>

    <root level="info">
        <appender-ref ref="CONSOLE" />
    </root>
</configuration>

配置完成后所有日志打印的异常都会自动使用简单类名格式。

内容的提问来源于stack exchange,提问作者Beginner

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 19:36:02