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
相关产品推荐
相关产品推荐

