我有一个ServiceExecutor
,运行一个很长的例程(调用、数据库更新、用户更新等等)。由于这些例程可能会导致多个错误,所以我想在一个地方捕获很多错误。所以我试着把它包起来。但是每个异常都应该得到一个自定义错误处理,因此将有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
}
}
发布于 2014-03-07 12:23:55
您可以轻松地将异常处理(针对每种类型的异常)和/或实际代码分解为单独的私有方法。
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) { ... }
}
如果真的有必要的话,甚至是这两种方法的结合。
发布于 2014-03-07 12:09:50
责任链模式可能会引起您的兴趣。另一种易于实现的方法是捕获任何异常,对我们来说是一个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
发布于 2014-03-07 12:27:44
你可能想试试AOP。您可以编写一个处理此方法周围异常的方面。
https://stackoverflow.com/questions/22249573
复制相似问题