Дизайн исключений Java: должен быть перехвачен или объявлен как выброшенный => Слишком большое влияние на код - PullRequest
0 голосов
/ 09 октября 2019

Отказ от ответственности: я из мира C #, поэтому этот вопрос может быть предвзятым из-за моего предыдущего опыта

У меня есть метод инициализации ведения журнала. Если это не удается, остальная часть приложения не должна запускаться, так как любой вызов в logger выдаст исключение NullPointerException.

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

Поэтому я начал удалять catch try и неожиданно получил жалобы от компилятора о том, что я должен объявить свое исключение ввесь стек, где вызывается этот метод.

Я понимаю логику, стоящую за этим, и привык к тому, что она практична: вы знаете, как этот метод может потерпеть неудачу.

Однако, это не подходит мне с точки зрения разделенияобязанность. Я не хочу, чтобы верхние уровни знали об этой потенциальной ошибке IOException, это очень специализированное поведение, которое не должно быть известно, например, методу main. И если мы придерживаемся этой логики, это означает, что:

  1. высшему уровню в конечном итоге придется объявить всю область исключений (от ввода-вывода до сети и пользовательских исключений ...)
  2. Любое добавление нового исключения может потенциально повлиять на множество файлов и кода

Я что-то упустил или это предназначенный дизайн исключения?

Ответы [ 3 ]

4 голосов
/ 09 октября 2019

Я думаю, что вы ищете не исключение Java, это ошибка Java.

Ошибка - это подкласс Throwable, который указывает на серьезные проблемы, которые разумное приложение не должно пытатьсяловить. Большинство таких ошибок являются ненормальными условиями. Ошибка ThreadDeath, хотя и является «нормальным» условием, также является подклассом Error, поскольку большинство приложений не должны пытаться ее перехватить.

https://docs.oracle.com/javase/7/docs/api/java/lang/Error.html

Вы можете выдать ошибку, которая указывает, что ваше приложение больше не будет работать, что вы объявили как правильное поведение.

0 голосов
/ 09 октября 2019

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

0 голосов
/ 09 октября 2019

Вы можете инкапсулировать проверенное исключение в RuntimeException (или одно, если у него есть дочерние элементы), которое не заставляет вас объявлять исключение:

public X execute() {
    try {
        return someThrowingMethod();
    } catch (Exception ex) {
        throw new RuntimeException(ex);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...