Как распространить исключение из переопределенного метода в Java

1

Какова наилучшая практика для прекращения выполнения переопределенного метода? Вот пример кода, который объясняет контекст:

@Override
protected String doInBackground(String... params) {

    URL serverURL = null;
try {
        serverURL = new URL((urlString));

    } catch (MalformedURLException e) {
        e.printStackTrace();
    }
...
...

return response.toJSONString();
}

В приведенном выше фрагменте кода я вынужден поймать MalformedURLException, поэтому я использовал блок catch try. Если это исключение возникает, я хотел бы пропустить весь код под блоком catch и распространять либо одно и то же исключение, либо другое, которое я бы выбрал в блоке catch до полного пути к методу Main, перепрыгивая через блоки catch и пропуская код посередине во всех вызывающих методах. Как это сделать?

Проблемы: 1) Я не могу добавить предложение throw к сигнатуре метода, потому что он переопределен, а базовый класс не позволяет его.

2) Поскольку метод должен возвращать String, я должен указать оператор return после блока catch. (Что мне нужно вернуть, если произошло исключение?)

3) Используйте System.exit в блоке catch. Как отмечают некоторые другие сообщения на этом форуме, это может быть не очень хорошая практика, когда вы хотите, чтобы ваш код был повторно использован.

  • 1
    Я бы назвал throw new RuntimeException(e) внутри улова. Он останавливает выполнение, и вызывающая сторона получает исключение для обработки.
  • 0
    Лично я считаю, что базовый класс должен позволять свое исключение. Может быть, MyBackGroundTaskException не является RuntimeException. Затем попросите дочерние классы бросить это, если это необходимо. Тогда пользователи класса вынуждены бороться с возможностью отказа.
Теги:
exception

1 ответ

3
Лучший ответ

Лучшей практикой для такого случая было бы обернуть MalformedURLException с помощью RuntimeException:

catch (MalformedURLException ex) {
    throw new RuntimeException("Failed constructing URL", ex);
}

В идеале вам бы очень хотелось изменить предложение метода throws, чтобы он мог вместить любые исключения, которые могут возникнуть из-за переопределений; но поскольку это невозможно в вашем случае (в соответствии с вашими условиями), вышеизложенное представляется мне наиболее разумным.

Связанная с этим передовая практика заключается в том, чтобы избежать регистрации исключения перед его переносом. С точки зрения дизайна, нет необходимости делать это - у вызывающего уже есть доступ к исходному объекту Exception (с помощью getCause() брошенного RuntimeException), поэтому вызывающий должен решить, следует ли его регистрировать или нет.

  • 2
    В дополнение к этому вы можете выполнить некоторую проверку urlString при получении, чтобы убедиться, что вы, вероятно, сможете создать new URL используя его; тогда вы можете сделать это исключение типа AssertionError чтобы указать, что это то, что вы считаете невозможным.
  • 0
    Благодарю. Это работает.

Ещё вопросы

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