Java 当构建缓存失败时,我应该抛出哪个异常?

Java 当构建缓存失败时,我应该抛出哪个异常?,java,exception,Java,Exception,我有一个包含缓存(Set)的类,缓存是基于实例化构建的。如果构建缓存失败(无法连接到数据库或某些数据库),我不知道应该抛出哪个异常/错误 我想到的一个异常是ExceptionInInitializerError,但javadoc说它是在初始化静态成员时抛出的 我是否应该抛出一个IllegalStateException,因为缓存没有生成,所以这个类是无用的 显然,我可以创建自己的ErrorOnBuildingCache并抛出它,但我想知道Java库中是否有任何异常适合这种情况。如果您对应该抛出哪

我有一个包含缓存(Set)的类,缓存是基于实例化构建的。如果构建缓存失败(无法连接到数据库或某些数据库),我不知道应该抛出哪个异常/错误

我想到的一个异常是
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 ???
       }          
   }
}