Java 当构建缓存失败时,我应该抛出哪个异常?
我有一个包含缓存(Set)的类,缓存是基于实例化构建的。如果构建缓存失败(无法连接到数据库或某些数据库),我不知道应该抛出哪个异常/错误 我想到的一个异常是Java 当构建缓存失败时,我应该抛出哪个异常?,java,exception,Java,Exception,我有一个包含缓存(Set)的类,缓存是基于实例化构建的。如果构建缓存失败(无法连接到数据库或某些数据库),我不知道应该抛出哪个异常/错误 我想到的一个异常是ExceptionInInitializerError,但javadoc说它是在初始化静态成员时抛出的 我是否应该抛出一个IllegalStateException,因为缓存没有生成,所以这个类是无用的 显然,我可以创建自己的ErrorOnBuildingCache并抛出它,但我想知道Java库中是否有任何异常适合这种情况。如果您对应该抛出哪
ExceptionInInitializerError
,但javadoc说它是在初始化静态成员时抛出的
我是否应该抛出一个IllegalStateException
,因为缓存没有生成,所以这个类是无用的
显然,我可以创建自己的
ErrorOnBuildingCache
并抛出它,但我想知道Java库中是否有任何异常适合这种情况。如果您对应该抛出哪个异常有疑问,那么您的代码用户也会有疑问。因此,定义您自己的异常类型(例如,FailedToInitializeCacheException
)并抛出该异常。这样就没有歧义了
IllegalStateException
将是一个合理的回退位置,但您永远不应该使用ExceptionInInitializeError
(或任何以Error
结尾的内容)-这是低级类加载器,不要弄乱它
显然,我可以创造我自己的
ErrorOnBuildingCache并将其抛出,但
我想知道Java中是否有例外
图书馆适合这种情况
这正是你应该做的。不要尝试使用现有的异常,而是创建自己的异常。因此,当抛出时,您知道它与缓存相关,而不是静态字段实例化错误或其他什么
另一方面,您不应该捕捉异常,除非是在非常特定的情况下。捕获异常将捕获诸如空指针异常、被零除、IO错误、安全异常等所有内容
我要做的是:
- 在重新旋转时包括原因 例外情况允许更好的 调查
- 捕获可能发生的异常 由于IO/网络问题,但 将它们与正确的错误关联 消息在您的情况下,这是DB异常
- 不要捕获到期的异常 编程错误(如null 指针),让它们弹出,以便 直接知道错误的真正原因
class Provider {
public Provider() {
buildCache();
}
private void buildCache() {
try {
this.cache = getDataFromDb();
} catch (Exception ex) {
throw new ???
}
}
}