【发布时间】:2019-03-15 06:57:04
【问题描述】:
我正在清理 SonarQube 问题,其中一个错误抱怨:定义并抛出一个专用异常,而不是使用通用异常。
public abstract class Message {
public abstract byte[] getPayload() throws Exception;
public abstract Optional<String> getStringMessage() throws Exception;
}
由于这是人们用作 API 的库中的一个类,以及人们继承的抽象类,我不确定将其更改为引发专用异常是否会影响其他服务,因此不好。任何建议、方向、答案将不胜感激!
【问题讨论】:
-
需要考虑两件事:使用和扩展。对于使用来说,这不会是一个问题,因为用户可能已经捕获了一个通用异常(这仍然是一种可怕的做法,但无论如何),所以如果你有一个自定义异常,他们的 catch 子句仍然可以工作。但是,对于扩展您的课程的人,他们的实现将被新代码破坏,因为新签名不匹配。抛出一个通用异常是个坏主意,但现在你不能在不破坏某些东西的情况下修复它
-
感谢亚瑟的建议!我可能会跳过这个错误,但只是好奇,新签名不匹配是什么意思?
-
想象一个开发者在他的代码中有你的库(一个依赖)。由于某些原因,他想扩展
Message类。所以他重写了getPayload和getString方法(因为他想这样做)。他的代码运行良好。现在,您发布了新版本的代码,这些方法带有自定义异常。如果他只是简单地升级他的依赖项,他将有一个编译错误,说他的覆盖函数与原始函数不匹配(因为现在,它必须抛出 CustomException 而不是 Exception)。这就是我们所说的重大变化 -
哦,我明白你的意思了。谢谢你:)