Я пытаюсь очистить код Java. Существует множество статических фабричных методов, которые выполняют одинаковую обработку исключений. В качестве примера рассмотрим createA
:
public static A createA() throws XXXX, YYYY {
try {
return somethingThatThrows();
} catch (InterruptedException | ExecutionException e) {
Throwable throwable = e.getCause();
if (throwable instanceOf XXXX) {
throw (XXXX) throwable;
} else if (e instance of YYYY) {
throw (YYYY) throwable;
} else if (throwable != null) {
throw new RuntimeException(throwable);
} else {
throw new RuntimeException(e);
}
}
}
Есть много таких create
методов (каждый из которых возвращает свой тип). Для каждого из этих методов существует копия этой обработки исключения (т. Е. Она дублируется). Я надеюсь, что есть способ избежать всего этого идентичного кода и разместить эту логику только в одном месте.
Конечно, без обработки исключений вы просто извлекаете логику вспомогательной функции, и дублирование решается - тот факт, что здесь есть обработка исключений, делает ее другой. Следующий код не строит:
public static void helper(final Exception e) {
Throwable throwable = e.getCause();
if (throwable instanceOf XXXX) {
throw (XXXX) throwable;
} else if (e instance of YYYY) {
throw (YYYY) throwable;
} else if (throwable != null) {
throw new RuntimeException(throwable);
} else {
throw new RuntimeException(e);
}
}
public static A createA() throws XXXX, YYYY {
try {
return somethingThatThrows();
} catch (InterruptedException | ExecutionException e) {
handle(e);
}
}
У кого-нибудь есть предложения?