Как реорганизовать обработку исключений в Java

Заранее спасибо, что прочитали мой вопрос.

Есть ли способ рефакторить код ниже?

Приведенный ниже код предназначен для обработки ошибок в моем проекте.

Я не использовал коды if-else и изменил имена переменных, чтобы упростить свой вопрос. В оригинале больше кодов if-else и переменных.

private static final String NUMBER_ONE = "number.one";
private static final String NUMBER_TWO = "number.two";
private static final String NUMBER_THREE = "number.three";
private static final String NUMBER_FOUR = "number.four";
private static final String NUMBER_FIVE = "number.five";

// ... more error names 

public void handler(ApiException exception, String customerNo, String code) {
    if (is(NUMBER_ONE, exception)) {
    throw new NumberOneException(customerNo, code);
    } else if (is(NUMBER_TWO, exception)) {
    throw new NumberTwoException(customerNo);
    } else if (is(NUMBER_THREE, exception)) {
    throw new NumberThreeException(code);
    } else if (is(NUMBER_FOUR, exception)) {
    throw new NumberFourException(customerNo, exception.toError());
    } else if (is(NUMBER_FIVE, exception)) {
    throw new NumberFiveException(exception.toError());

    // ... too many if-else sentences :-(
     
    }

private boolean is(String errorCode, ApiException exception) {
    return StringUtils.equals(errorCode, exception.getCode());
    }

Я думал либо о Enum, либо о HashMap, но не смог применить ни один из них.

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

Я все еще думаю об использовании HashMap, но не уверен, эффективно это или нет.

Ваш код не имеет смысла. У вас есть метод is, который принимает 2 параметра (ApiException, String). Однако во всех примерах это так: is(NUMBER_ONE, exception), где NUMBER_ONE — это String. Ты хотел обратить это вспять?

davidalayachew 20.12.2022 00:54

Как сказал davidalayachew, у вас поменялись местами параметры. Кроме того, есть стандартный метод equals, который вы можете вызывать для каждого String. Нет необходимости вызывать внешнюю библиотечную функцию, например StringUtils.equals. И когда вы используете стандартную String функциональность сопоставления, вы можете просто использовать switch(exception.getCode()) { case NUMBER_ONE: throw new NumberOneException(customerNo, code); case NUMBER_TWO: … etc Вы также можете создать фабричный интерфейс для своих исключений и использовать карту из строки в фабрику, однако инициализация карты не короче, чем оператор switch.

Holger 21.12.2022 13:27

Привет @davidalayachew, Спасибо за ваш отзыв. Я исправил is правильно.

Astrid 22.12.2022 02:38

Спасибо за ответ @Holger. Похоже, что использование переключателя будет короче исходного кода, как вы упомянули.

Astrid 22.12.2022 02:39
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
4
60
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Взгляните на паттерн Factory method, который кажется наиболее подходящим в представленном случае.

Другие вопросы по теме