2011-05-18 79 views
6

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

class Provider { 

    public Provider() { 
     buildCache(); 
    } 

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

一个例外来在我心目中是ExceptionInInitializerError,但javadoc中说,这是在初始化静态成员抛出。

我应该抛出一个IllegalStateException导致缓存没有建立,所以这个类是无用的吗?

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

回答

9

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

IllegalStateException将是一个合理的退路,但你应该永远,永远使用ExceptionInInitializerError(或任何在Error结束) - 这是低层次的类加载器的东西,不要惹那个。

1

显然,我可以创建自己的 ErrorOnBuildingCache扔,但 我不知道如果在Java中 库适合任何异常这一情况。

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

在附注中,除非特殊情况,否则不应捕获异常。捕捉异常将捕获像空指针异常,除以零,IO错误,安全异常等一切。

我会做的是:

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