我希望创建一个例外工厂
我有一个连接到不同数据存储的服务,这些数据存储会引发许多异常。 我不想将这些异常返回给服务的用户,而是返回更高级别的异常 例如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?
答案 0 :(得分:1)
这是一个非常糟糕的主意?在我看来,是的。这是一个坏主意。使用Exception
(s)的昂贵部分是填充堆栈跟踪。如果您预先创建并保存您抛出的Exception
,则堆栈跟踪将毫无意义(或至少大大降低值)。您目前还没有记录堆栈跟踪,所以我也会更改
log.error(ex);
到
log.error("Caught exception: " + ex.getMessage(), ex);
同样实例化具有根本原因的异常 -
throw new storeServiceException("Exception in storage.", ex);
名称应遵循常规命名约定。 Java类名称以大写字母开头 - 你的'看起来像一个变量。