Как улучшить некрасивый блок catch, используя исключение instanceof

1

Обратите внимание: звонящий выдает только родительское исключение !!

Скажем, что 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.

  • 0
    Там есть форматирование кода. Отступ или использование передних тиков, `` `` для встроенного кода
  • 3
    Решение: не ловить Exception . Поймать отдельные исключения. Вот почему у вас есть предложения catch в первую очередь!
Показать ещё 4 комментария
Теги:
exception
instanceof
inherited

1 ответ

7

Как и другие предложения в комментариях, вы должны использовать несколько предложений 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) достигается и выполняется первым.

  • 0
    1, после перехвата (ParentException e) BException больше не будет заботиться. и 2, как показывает мой код, rootCaller не может перехватить подкласс ParentException, потому что он не знает их из функции вызывающей стороны
  • 0
    @ user1542687 Читайте мой последний абзац. Я сделал это с целью показать, что порядок имеет значение.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню