目前我正在使用库,它可以抛出很多不同的异常(每个方法调用8-10个),并且大多数必须被处理,更糟糕的是每个方法(在任何时候)都可以抛出{{1}我必须重新尝试进行身份验证。例如:
AuthenticationExpiredException
这是异常处理的最小例子之一。这里的主要问题是,有没有办法减少处理异常的代码量,并使逻辑更清晰?
感谢您的反馈。我决定通过包装每个方法并分别处理它来为这个库创建单独的包装器。为了支持不同的处理方法,我为包装器创建了接口,然后使用我的自定义包装器实现它:
try {
xStream = xSet.createXStream(id, binding, mimeType); //Method call
} catch (AuthenticationExpiredException authenticationExpiredException) {
try {
this.authenticate(); // re-authenticate
xStream = xSet.createXStream(id, binding, mimeType); //Method call again
} catch (XAMException xamException) {
throw new ConnectorException(
"Error occurred during creating new Blob after attempting to re-authenticate",
xamException);
}
} catch (XSystemCorruptException xSystemCorruptException) {
this.entities.clear();
this.closeConnection();
throw new ConnectorException("XSystem was corrupt and connection was closed",
xSystemCorruptException);
} catch (XSetCorruptException xSetCorruptException) {
this.closeEntity(entity);
throw new ConnectorException("XSet for entity: " + entity.getXuid()
+ " was currupt and removed", xSetCorruptException);
} catch (XAMException xamException) {
throw new ConnectorException(
"Error occurred during creating new Blob.", xamException);
}
答案 0 :(得分:6)
如果有一致的方法来处理这些方法(即你总是以相同的方式包装它们并重新抛出RuntimeException
,那么自定义包装器库可能是适当的方法。当有2-3种不同的方法来处理它们时(通过为单个包装的方法/类提供2-3个包装器方法(或甚至类)),这仍然可以工作。
或者,如果两个或多个异常类型具有完全相同的处理代码,那么您可以尝试查找Java 7 to get multi-catch。
答案 1 :(得分:3)
您可以使用Template method模式。 JdbcTemplate是一个很好的例子,说明这种设计模式如何简化异常繁重的代码(在这种情况下为SQLException
)。
答案 2 :(得分:2)
如果API确实设计为抛出那么多异常,并且每个异常需要不同的处理,那么你就无能为力了。
您可以做的一件事是在单独的方法中移动重复的代码,或者使用Java 7 multi-catch。
答案 3 :(得分:0)
如果您对每个例外都有不同的事情,我担心所有这些捕获语句可能都是必要的。但是,如果您有大量具有相同内容或大量资源的catch语句要关闭,您可能会查看新的Java 7功能,例如一个catch中的多个异常和自动资源处理。我不确定Java 7是否适合您。