gpt4 book ai didi

java - 为什么 Java 在 Exception/Throwable 类中没有 setMessage?

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:08:01 26 4
gpt4 key购买 nike

我无法理解为什么 Java 不允许在异常类型(或其父类(super class) Throwable)创建后更改异常消息。它允许使用 setStackTrace 更改 stackTrace 而不是消息。

我的用例对我来说似乎是真实的,希望有一些替代方案。

用例

我有一个 Controller 服务 X,它调用比方说 10 个其他依赖服务。为了简化调试,如果依赖服务抛出一些异常,我们希望从服务 X 到其上游显示一些标识符,以便轻松识别失败的请求。为此,我们有为每个依赖项创建和设置的 requestId。

现在,为了避免所有依赖服务之间的重复并简化代码,我们可以创建一个通用拦截器,让我们能够在每次调用之前和之后做一些工作。有点像 -

// do some work

requestId = getRequestId(); // create or somehow get requestId
dependentService.setRequestId(requestId);

try {
dependentService.call();
}
catch (Exception e) {
e.setMessage(e.getMessage() + ... + requestId);
throw e;
}

//do some work

但是Java不允许我们设置消息。同时,我们想保留异常及其类型(可以是依赖服务定义的任何自定义类型),所以我不想做类似 throw new Exception(e.getMessage( ) + ...)

最佳答案

这不是真的它的意思,但您可以使用 addSuppressed 附加另一个异常:

} catch (Exception e) {
e.addSuppressed(new ExtraInfoException(...));
throw e;
}

其中 ... 包含您要包含的额外信息。

与添加到异常消息相比,这样做的优势在于您可以定义 ExtraInfoException,以便它在字段中包含您想要的信息,而不必从异常消息中解析出来.

话虽如此,附加更多异常信息的更惯用的方法是:

} catch (Exception e) {
throw new ExtraInfoException(e, ...);
}

它具有允许您返回结构化信息的完全相同的优势,还有一个额外的优势是您可以直接捕获 ExtraInfoException,而不是捕获 Exception 然后寻找额外的信息反射(reflection)。

关于java - 为什么 Java 在 Exception/Throwable 类中没有 setMessage?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57668142/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com