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

Kotlin中如何仅打印异常消息而非全限定异常类名?

问题描述

在Kotlin中定义了如下自定义异常AbcException:

public final class AbcException extends Exception {
  private static final long serialVersionUID = 1L;

  public AbcException() {
  }

  public AbcException(String message) {
    super(message);
  }

  public AbcException(String message, Throwable cause) {
    super(message, cause);
  }

  public AbcException(Throwable cause) {
    super(cause);
  }
}

调用异常实例的message属性时,返回内容是全限定异常类名加消息(格式类似exceptionClass: Some message),而非预期的纯消息文本,导致单元测试中无法直接用assertEquals断言,只能改用contains判断。

原因分析

Java/Kotlin原生的Exception类不会自动在message中拼接类名,出现这种情况通常是抛出异常的代码里,手动将类名和消息文本拼接后传入了AbcException的构造函数,比如:

throw AbcException("com.example.AbcException: CaseItem delete failed: item token=token1")

而非直接传入纯消息:

throw AbcException("CaseItem delete failed: item token=token1")

解决方案

方案1:修复抛出异常的代码(优先推荐)

检查所有抛出AbcException的代码,确保传入构造函数的message参数是纯消息文本,不要额外拼接异常类名。这样原生的getMessage()(对应Kotlin的message属性)就会返回纯消息。

方案2:重写getMessage()方法(兜底方案)

如果无法修改抛出代码,或者是第三方框架导致的类名拼接,可以在AbcException中重写getMessage()方法,手动剥离类名部分:

public final class AbcException extends Exception {
  private static final long serialVersionUID = 1L;

  // 保留原构造函数
  public AbcException() {}
  public AbcException(String message) { super(message); }
  public AbcException(String message, Throwable cause) { super(message, cause); }
  public AbcException(Throwable cause) { super(cause); }

  @Override
  public String getMessage() {
    String originalMsg = super.getMessage();
    if (originalMsg == null) return null;
    // 按": "分割,取第二部分;如果没有分割到则返回原消息
    int colonIndex = originalMsg.indexOf(": ");
    return colonIndex != -1 ? originalMsg.substring(colonIndex + 2) : originalMsg;
  }
}

重写后,调用e.message就会返回剥离类名后的纯消息文本。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 16:25:38