用于更高级别异常的Java异常工厂

时间:2017-07-07 12:39:51

标签: java

我希望创建一个例外工厂

我有一个连接到不同数据存储的服务,这些数据存储会引发许多异常。 我不想将这些异常返回给服务的用户,而是返回更高级别的异常 例如storeServiceTransientReadException

当连接到数据存储时,我将使用try,catch throw模式;例如,对于Cassandra连接:

public ResultSet safeExecute(Statement statement) throws StoreServiceException {
    try {
        return session.execute(statement);
    } 
    catch(QueryExecutionException ex){
        log.error(ex);
        StoreServiceException storeException = StoreServiceExceptionFactory.getTransientException(ex);
        throw storeException;
    }

在cassandra示例中,我希望工厂创建读取或写入storeServiceException异常,具体取决于异常是否为ReadFailureException,ReadTimeoutException,WriteFailureException或WriteTimeoutException

对于其他数据存储,我想遵循相同的模式,那么服务的用户只需要担心服务错误而不是特定的数据存储错误。

对于工厂,我想的是(伪)中的一些东西:

public class ExceptionsFactory {

public StoreServiceTransientException getTransientException(Exception ex){

    if  ReadException
        return  StoreServiceTransientException("read exception ")


    if WriteException 
        return  StoreServiceTransientException("write exception ")

}

public StoreServiceNonTransientException getTransientNonException(Exception ex){

    if  ReadException
        return  StoreServiceNonTransientException("read exception ")


    if WriteException 
        return  StoreServiceNonTransientException("write exception ")


}

但我找不到很多让我担心的网上例子。 这是一个非常糟糕的主意? 我应该有更多特定的catch块来返回我想要的storeServiceException?

1 个答案:

答案 0 :(得分:1)

这是一个非常糟糕的主意?在我看来,是的。这是一个坏主意。使用Exception(s)的昂贵部分是填充堆栈跟踪。如果您预先创建并保存您抛出的Exception,则堆栈跟踪将毫无意义(或至少大大降低值)。您目前还没有记录堆栈跟踪,所以我也会更改

log.error(ex);

log.error("Caught exception: " + ex.getMessage(), ex);

同样实例化具有根本原因的异常 -

throw new storeServiceException("Exception in storage.", ex);

名称应遵循常规命名约定。 Java类名称以大写字母开头 - 你的'看起来像一个变量。