Как вы обрабатываете "невозможные" исключения в Java? - программирование

Как вы обрабатываете "невозможные" исключения в Java?

Иногда мне придется поймать исключение, которое, как я знаю, никогда не произойдет, например здесь

URLDecoder.decode("some string", "UTF-8"); //No unknown encoding possible

или здесь:

public void methodWithURL(URL url){
    URI uri = new URI(url); //No invalud URI syntax possible
}

Как вы справляетесь с этим? Я обычно регистрирую смешную ошибку, касающуюся того, как изменились законы Вселенной, а затем бросьте RuntimeException. Есть ли лучший способ?

4b9b3361

Ответ 1

Я улавливаю Exception и завершаю его в Error. из документа Error:

Ошибка - это подкласс Throwable, который указывает на серьезные проблемы что разумное приложение не должно пытаться поймать.

Ответ 2

Я пропустил бы забавное сообщение.

BTW: У меня был случай, когда часть кода (в небольшой библиотеке) предполагала, что будет доступна кодировка. Только он был развернут на ограниченном устройстве и взорвался во время выполнения.

Проверенные исключения служат для показа мест в нашем коде, где мы должны сделать паузу на секунду и рассмотреть пути, которые меньше пройдены (как в том, что делает мое приложение, когда сеть умирает), и в других случаях с углами). Завершение их в IllegalStateException и повторное создание - это своего рода подписанный контракт, в котором программист говорит: "Да, все риски, которые я рассматриваю, берут на себя всю ответственность за место прямо здесь". Если бы это было не для проверенных исключений, мы бы не знали, какое сознательное решение было принято из простой мысли.

Ответ 3

Ну, ИМХО есть лучший способ, чем "log [ging] смешная ошибка относительно того, как изменились законы вселенной", потому что при этом вы "милые", что среди друзей прекрасно, но не универсально (не предназначен для каламбура). Ваш код может быть прочитан другими, и если ваш юмор падает ровно (на них), вы действительно не сделали никаких друзей.

Многие руководства по стилю делают предложения для невозможных исключений. Вы можете использовать пустой блок catch с параметром исключения с именем willNeverHappen; вы можете поместить комментарий в пустой блок; вы можете выбросить исключение во время выполнения (возможно, лучшее, так как вы MIGHT misspell UTF-8!)

Если вы хотите быть супер амбициозным, вы можете написать аннотацию, например SneakyThrows в Ломбоке. Если вы считаете, что это "лучше", это просто вопрос вкуса.:)

Обратите внимание, что этот вопрос обсуждался на https://softwareengineering.stackexchange.com/questions/122233/how-to-deal-with-checked-exceptions-that-cannot-ever-be-thrown.

Ответ 4

Здесь мое решение - разработано для Android, но может быть легко адаптировано для "обычной" Java:

public class ImpossibleException extends RuntimeException {
    public ImpossibleException(@NonNull String whyNotPossible) {
        this(whyNotPossible, null);
    }

    public ImpossibleException(@NonNull String whyNotPossible, Throwable throwable) {
        super("Impossible exception: " + whyNotPossible, throwable);
        Log.e("Impossible", whyNotPossible, throwable);
    }
}

Использование:

try {
    byte[] data = "Hello".getBytes("utf-8");
    Log.i("Test", "data.length=" + data.length);
} catch (UnsupportedEncodingException e) {
    throw new ImpossibleException("Android always supports utf-8", e);
}

Конструктор whyNotPossible означает, что нет необходимости регистрировать ошибку там, где это происходит, а также нет необходимости в комментариях.

Я думаю, это вопрос вкуса, если это должно быть ImpossibleException extends RuntimeException или ImpossibleError extends Error.