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实现示例:
- 自定义转换器:
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 ""; } }
- 修改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
相关产品推荐
相关产品推荐

