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

时间:2011-05-18 08:13:29

标签: java exception

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

class Provider {

   public Provider() {
       buildCache();
   }

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

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

我应该抛出IllegalStateException因为缓存没有构建,所以这个类没用吗?

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

2 个答案:

答案 0 :(得分:9)

如果怀疑应该抛出哪个异常,那么代码的用户也是如此。因此,定义您自己的异常类型(例如FailedToInitializeCacheException)并抛出它。这样没有歧义。

IllegalStateException将是一个合理的后备位置,但你永远不应该使用ExceptionInInitializerError(或以Error结尾的任何东西) - 这是低级的类加载器,不要乱那个。

答案 1 :(得分:1)

  

显然我可以创造自己的   ErrorOnBuildingCache然后抛出它   我想知道Java中是否有任何异常   图书馆适合这种情况。

这正是你应该做的。不要尝试使用现有的异常,而是自己创建一个异常。所以你知道什么时候它与你的缓存有关,而不是静态字段实例化错误或其他什么。

另外,在特定情况下,您不应该捕获例外情况。捕获异常将捕获所有内容,如空指针异常,除以零,IO错误,安全异常。

我要做的是:

  • 重新抛出时包括原因 允许更好的例外 调查
  • 捕获可能发生的异常 由于IO /网络问题但是 将它们与正确的错误相关联 信息。在你的情况下,这是数据库异常。
  • 不要捕捉到期的异常 编程错误(如null) 指针),让它们弹出让你 直接知道真正的错误原因。