Какова наилучшая практика для прекращения выполнения переопределенного метода? Вот пример кода, который объясняет контекст:
@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. Как отмечают некоторые другие сообщения на этом форуме, это может быть не очень хорошая практика, когда вы хотите, чтобы ваш код был повторно использован.
Лучшей практикой для такого случая было бы обернуть MalformedURLException
с помощью RuntimeException
:
catch (MalformedURLException ex) {
throw new RuntimeException("Failed constructing URL", ex);
}
В идеале вам бы очень хотелось изменить предложение метода throws
, чтобы он мог вместить любые исключения, которые могут возникнуть из-за переопределений; но поскольку это невозможно в вашем случае (в соответствии с вашими условиями), вышеизложенное представляется мне наиболее разумным.
Связанная с этим передовая практика заключается в том, чтобы избежать регистрации исключения перед его переносом. С точки зрения дизайна, нет необходимости делать это - у вызывающего уже есть доступ к исходному объекту Exception
(с помощью getCause()
брошенного RuntimeException
), поэтому вызывающий должен решить, следует ли его регистрировать или нет.
urlString
при получении, чтобы убедиться, что вы, вероятно, сможете создать new URL
используя его; тогда вы можете сделать это исключение типа AssertionError
чтобы указать, что это то, что вы считаете невозможным.
throw new RuntimeException(e)
внутри улова. Он останавливает выполнение, и вызывающая сторона получает исключение для обработки.