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

6

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

class Provider {

   public Provider() {
       buildCache();
   }

   private void buildCache() {
       try {
           this.cache = getDataFromDb();
       } catch (Exception ex) {
           throw new ???
       }          
   }
}

我想到一个例外,那就是ExceptionInInitializerError,但是javadoc说它是在初始化静态成员时抛出的。

如果缓存没有构建完成,这个类就无用了,我应该抛出一个IllegalStateException吗?

显然,我可以创建自己的ErrorOnBuildingCache并将其抛出,但我想知道Java库中是否有适合这种情况的异常。

2个回答

9
如果你不确定应该抛出哪个异常,那么使用你自己定义的异常类型(例如FailedToInitializeCacheException),然后抛出该异常。这样就不会有歧义了。 IllegalStateException 可以作为合理的备选方案,但你绝对不能使用 ExceptionInInitializerError (或以 Error 结尾的任何东西)- 那是底层的类加载器问题,不要碰它。

1

显然,我可以创建自己的ErrorOnBuildingCache并将其抛出,但我想知道Java库中是否有任何异常适用于这种情况。

这正是您应该做的。不要尝试使用现有的异常,而是创建自己的异常。这样,当它被抛出时,您就知道它与您的缓存相关,而不是静态字段实例化错误或其他问题。

顺便说一句,在除非特定情况下,否则不应捕获异常。捕获异常会捕获所有异常,例如空指针异常、除零错误、IO错误、安全异常等。

我会这样做:

  • 在重新抛出异常时包含原因,以便更好地进行调查
  • 捕获可能由于IO/网络问题而发生的异常,但将其与正确的错误消息相关联。在您的情况下,这是DB异常。
  • 不要捕获由编程错误(如空指针)引起的异常,让它们弹出,这样您就直接知道了真正的错误原因。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接