我有ServiceExecutor
并运行一个长例程(webervices调用,数据库更新,用户更新等)。由于这些例程可能导致多个错误,我想在一个地方捕获大量错误。因此我用trycatch包装它。但是每个异常应该得到一个自定义错误处理,因此将有5到10行代码来解决错误。
问题:我的runLongRoutine()
太大了,所以我不得不考虑错误处理因素。但我不想重新抛出这些例外,因为任何使用runLongRoutine()
的班级都不应该关心错误,甚至不能知道错误可能会发生。
我怎样才能在这里调整错误处理?我可以选择一种设计模式吗?
class ServiceExecutor {
void runLongRoutine() {
try {
several(param1);
calls();
to(param2);
different(param3, param1);
methods();
} catch (CustomException e) {
//5-10 lines of code
} catch (IOException e) {
//5-10 lines of code
} catch (NetworkException e) {
//5-10 lines of code
}
//to be continued
}
}
答案 0 :(得分:1)
Chain-of-responsibility 模式可能会让您感兴趣。另一种易于实现的方法是捕获任何异常,并向我们发送Map<Class<? extends Throwable>, Handler>
,它将异常类型映射到异常处理程序。如果您找不到任何使用默认处理程序或只是重新抛出它。
try {
// some code
} catch (Throwable e) {
ExceptionHandler handler = handlers.get(e.getClass());
if (handler != null) handler.handle(e);
else DEFAULT_HANDLER.handle(e);
}
// to be continued
答案 1 :(得分:1)
您可以轻松地将异常处理(针对每种类型的异常)和/或实际代码分解为单独的私有方法,例如
class ServiceExecutor {
void runLongRoutine() {
try {
runLongRoutine0();
} catch (CustomException e) {
//5-10 lines of code
} catch (IOException e) {
//5-10 lines of code
} catch (NetworkException e) {
//5-10 lines of code
}
//to be continued
}
private void runLongRoutine0() throws CustomException, IOException, NetworkException {
several(param1);
calls();
to(param2);
different(param3, param1);
methods();
}
}
或
class ServiceExecutor {
void runLongRoutine() {
try {
several(param1);
calls();
to(param2);
different(param3, param1);
methods();
} catch (CustomException e) {
handleCustomException(e);
} catch (IOException e) {
handleIOException(e);
} catch (NetworkException e) {
handleNetworkException(e);
}
//to be continued
}
private void handleCustomException(CustomException e) { ... }
private void handleIOException(IOException e) { ... }
private void handleNetworkException(NetworkException e) { ... }
}
如果确实有必要,甚至可以采用两种方法的组合。
答案 2 :(得分:0)
您可能想尝试AOP。 您可以编写一个处理此方法异常的方面。