Я видел, как эта тема иногда возникала в прошлом, но даже после поиска в Google об этом , я до сих пор не могу понять, что было бы хорошим и элегантным способом справиться с этим, так что вот этоидет.
Скажем, у меня есть код, который выдает различные исключения ...
try {
/* some code that throws these exceptions */
} catch (NoSuchAuthorityCodeException e) {
throw new MyAPIException("Something went wrong", e);
} catch (FactoryException e) {
throw new MyAPIException("Something went wrong", e);
} catch (MismatchedDimensionException e) {
throw new MyAPIException("Something went wrong", e);
} catch (TransformException e) {
throw new MyAPIException("Something went wrong", e);
}
... и, как мы видим, я просто обертываю эти исключения и выкидываю новый, говорящий, чточто-то пошло не так в моем API.
Это кажется мне слишком повторяющимся кодом, так что можно просто перехватить тип исключения, обработать его, обернуть и выдать новый.
try {
/* some code that throws these exceptions */
} catch (Exception e) {
throw new MyAPIException("Something went wrong", e);
}
Вв этом случае все гораздо проще, но дело в том, что мы будем ловить и каждое исключение RuntimeException.Учитывая это, мы могли бы перехватить RuntimeException, чтобы избежать этого.
try {
/* some code that throws some exceptions */
} catch (RuntimeException e) {
throw e;
} catch (Exception e) {
throw new MyAPIException("Something went wrong", e);
}
Это немного громоздко, но это помогает.Теперь есть еще одна небольшая проблема, связанная с перехватом (исключение e), что если мой внутренний API генерирует другое MyAPIException, оно также будет перехвачено, упаковано и выброшено в другом MyAPIException.В этом конкретном случае мы могли бы также перехватить MyAPIException и перезапустить его.
try {
/* some code that throws some exceptions */
} catch (RuntimeException e) {
throw e;
} catch (MyAPIException e) {
throw e;
} catch (Exception e) {
throw new MyAPIException("Something went wrong", e);
}
Что ж, это снова становится грязным, но в этом случае мы предотвращаем упаковку MyAPIException и просто перекидываем его.Но есть и еще одна проблема с блоком catch (Exception e), заключающаяся в том, что если внутренний API изменяется и начинает выдавать другое исключение (некоторые, кроме этих 4, упомянутых выше), компилятор ничего не скажет об этом, и мы не будемПонятия не имею.Не то чтобы это было серьезной проблемой, поскольку, вероятно, я бы отнесся к этому таким же образом.
При таком сценарии я думаю, что вопрос в том, какой из них лучше, и есть ли лучшие варианты?