我无法理解为什么Java一旦创建便不允许更改Exception类型的异常(或其超类Throwable)的异常消息。它允许使用setStackTrace而不是消息来更改stackTrace。
我使用的用例对我来说似乎是真实的,并且希望能有一些替代选择。
用例
我有一个控制器服务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
Run Code Online (Sandbox Code Playgroud)
但是Java不允许我们设置消息。同时,我们要保留异常及其类型(可以是依赖服务定义的任何自定义类型),所以我不想做类似的事情throw new Exception(e.getMessage() + ...)