Обратите внимание: звонящий выдает только родительское исключение !!
Скажем, что aexception
и bexception
наследуются от parentexception
.
В методе af
он throws aexception
, bexception
и parentexception
.
void af() throws aexception, bexception, parentexception {}
caller
метод вызывает af
и throw parentexception
только throw parentexception
.
void caller() throws parentexception
Здесь мы потеряли информацию о подклассах parentexception.
Метод rootCaller
вызывает метод caller
а rootcaller
может только catch parentexception
caller
и использовать следующий блок catch catch исключения:
void rootCaller() {
try {
caller();
} catch(parentexception e) {
if(e instanceof aexception) {
......
} else if(e instanceof bexception) {
......
} else if(e instanceof parentexception) {
......
} else {
......
}
}
Это настолько уродливо и очень легко забыть о каком-то подклассе parentexception, если слишком много подклассов.
Есть ли способ улучшить код?
Текущий ответ не может дать мне никакой идеи:
1, rootCaller cannnot использует многопользовательский режим, чтобы упростить процесс, вызывающий вызывающий только порождает родительское исключение.
2, потому что вызывающий только генерирует родительское исключение, нет никакой другой проверки исключений, если af изменен последним, чтобы выкинуть больше, чем исключение и bexception, скажем, cexception.
Как и другие предложения в комментариях, вы должны использовать несколько предложений catch.
void rootCaller() {
try {
caller();
} catch (AException e) {
// ...
} catch (ParentException e) {
// ...
} catch (BException e) {
// ...
} catch (AnotherException e) {
// ...
} catch (Exception e) {
// ...
}
}
Учет уловов тоже имеет значение. Исключение будет проверяться в каждом случае по очереди и только инициирует первый, который соответствует.
Так, например, с AException
и BException
расширяющими ParentException
в моем catch (BException e)
блок catch (BException e)
никогда не может быть достигнут, поскольку catch (ParentException e)
достигается и выполняется первым.
Exception
. Поймать отдельные исключения. Вот почему у вас есть предложенияcatch
в первую очередь!