как обрабатывать случаи, которые должны иметь много исключений? - PullRequest
0 голосов
/ 04 июля 2018

Мне пришлось использовать отражение, чтобы создать группу классов. С этим все хорошо, но рефлексия использует много исключений, и мой метод выглядит ужасно.

Что советуют передовые практики в этих случаях?

Предполагается, что эти исключения будут выброшены и перехвачены в высокоуровневом классе, чтобы иметь возможность дать четкую информацию об ошибке, но если я собираюсь пройти через 6 или 8 исключений среди всех используемых методов и классов, код будет ужасно, хаотично и очень ужасно.

private Filter getFilterInstance(String path){
    try {
        return (Filter) Class.forName(path).getConstructor().newInstance();
    } catch (ClassNotFoundException | NoSuchMethodException | SecurityException | InstantiationException | IllegalAccessException | IllegalArgumentException | InvocationTargetException ex) {
        Logger.getLogger(FiltersBuilder.class.getName()).log(Level.SEVERE, null, ex);
        return null;
    }
}

Ответы [ 4 ]

0 голосов
/ 04 июля 2018

Вы можете поймать ReflectiveOperationException

Это супер тип:

  • ClassNotFoundException
  • IllegalAccessException
  • InstantiationException
  • InvocationTargetException
  • NoSuchFieldException
  • NoSuchMethodException

Что означает, что вам просто нужно:

} catch (ReflectiveOperationException | SecurityException | IllegalArgumentException ex) {
    Logger.getLogger(FiltersBuilder.class.getName()).log(Level.SEVERE, null, ex);
    return null;
}

Поскольку SecurityException & IllegalArgumentException фактически являются исключениями времени выполнения, вы можете:

} catch (ReflectiveOperationException ex) {
    Logger.getLogger(FiltersBuilder.class.getName()).log(Level.SEVERE, null, ex);
    return null;
}

, если вы в порядке с RuntimeException, распространяющимся на абонентов.

0 голосов
/ 04 июля 2018

Многие люди утверждают, что война между проверенными и непроверенными исключениями окончена.

Не проверено, выиграл!

Таким образом, простой ответ таков: окружите ваш код простой перехватом Exception на самом низком уровне, поместите это исключение в (возможно, специализированное) RuntimeException и перебросьте его.

Затем на том верхнем уровне, который в этом нуждается, перехватите исключение обертывания, получите доступ к его причине и устраните его соответствующим образом. Где: скорее всего, почти все различные проверенные исключения, которые вы здесь просматриваете, напоминают внутреннюю ошибку. Так что в первую очередь не так много «другого сообщения об ошибке».

0 голосов
/ 04 июля 2018

Если для каждого типа исключения требуется разная логика обработки, используйте отдельные блоки перехвата.

Если нескольким из них требуется одинаковая логика обработки, перехватите их в одном и том же блоке.

Если для всех возможных исключений требуется одинаковая логика обработки, перехватите базовый тип исключения. Это похоже на правильное решение для вашего кода, потому что вы передаете их в свой регистратор независимо от того, какого типа они.

private Filter getFilterInstance(String path){
    try {
        return (Filter) Class.forName(path).getConstructor().newInstance();
    } catch (Exception ex) {
        Logger.getLogger(FiltersBuilder.class.getName()).log(Level.SEVERE, null, ex);
        return null;
    }
}
0 голосов
/ 04 июля 2018

Лучший способ - обращаться с ними отдельно.
Причина

..
catch(Exception1 | Exception2 ex)
  1. Будет непросто проверить, какое исключение произошло, а затем написать способы его обработки.

    Почему вы хотите добавить ненужные операторы, чтобы проверить, какое исключение произошло?

  2. Просто ваш код становится нечитаемым.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...