WMX · 随记
·Java· 3 分钟阅读

异常包装:保留 cause,让错误有来处

业务层只抛出“处理失败”,会让日志丢掉文件路径、操作阶段和原始错误。异常信息既要给调用方语义,也要保留排查线索。

▶ 本文含视频讲解
▶ 教学视频手动播放 · 英语讲解

Java Full Course

Java 基础课程作为语言背景复习;本文的特定 API、版本行为和边界条件以正文及文档为准。此为外部原版课程,多篇笔记可能共用;未剪辑为本文专属视频。

播放器需要能访问 YouTube 的网络;若这里无法加载,可打开原视频。本文与本地图解仍可独立阅读。

Java 系列概览:类型与值、状态与资源、边界验证
Java 系列概览:类型与值、状态与资源、边界验证 点击图片查看大图 ↗

问题从哪里出现

业务层只抛出“处理失败”,会让日志丢掉文件路径、操作阶段和原始错误。异常信息既要给调用方语义,也要保留排查线索。

理解核心机制

捕获底层异常后,可以用带 cause 的构造方法包装成业务层异常。对外输出的消息应受控,内部日志则按需要记录堆栈。不要只复制 exception.getMessage,因为那会丢失类型和调用链。

动手做一个小实验

Java 17 或更新版本;将示例保存为 Demo.java,执行 javac Demo.java 后运行 java Demo。

Java17 行 · 可横向滚动
import java.nio.file.Files;
import java.nio.file.Path;
import java.io.IOException;
public class Demo {
    static String read(Path path) {
        try { return Files.readString(path); }
        catch (IOException error) {
            throw new IllegalStateException("cannot load configuration", error);
        }
    }
    public static void main(String[] args) {
        try { read(Path.of("missing-config.txt")); }
        catch (IllegalStateException error) {
            System.out.println(error.getCause().getClass().getSimpleName());
        }
    }
}

适用边界与常见误区

异常消息里不要随意拼接密码、令牌或完整个人数据。不要无差别捕获 Throwable,也不要捕获后仅打印并继续返回一个看起来成功的值。

继续练习

分别制造文件不存在和权限不足的情况,确认上层语义一致、底层 cause 仍可区分。

参考资料

阅读相关官方文档或原始资料 ↗

← 返回文章归档