Как правильно организовать вывод сообщения об ошибке в Java-программе?

Добрый день, Хабр!


Возник такой вопрос: как правильно реагировать на неправильные аргументы на входе?


Ситуация такая:

пишу запускалку для одного веб-сервера. По замыслу она может запускаться в двух режимах:

1) В режиме embedded (тогда ее конфигурируют в основном приложении)

2) В режиме standalone (тогда ей передают параметры через командную строку)


Сейчас сделано так:

Все аргументы валидируются в одном месте (в сеттерах объекта конфигурации) и в случае если параметр критичный (например, порт, на котором стартует сервер), то во вне выбрасывается исключение.


Ситуация усугубляется тем, что валидация происходит в конструкторе, то получается что даже конструктор выкидывает исключение (что мягко говоря не должно быть, судя советам в книге «Совершенный код»).
  • Вопрос задан
  • 4935 просмотров
Пригласить эксперта
Ответы на вопрос 2
serso
@serso
Всё правильно делаете. Только если у вас приложение из консоли запускается я бы предложил использовать Commons CLI для парсинга входных аргументов.
Не вижу проблемы валидации в конструкторе (например), но если очень хочется изменить — введите статичный фактори метод, в который помесьтите всю валидацию, а конструктор сделайте приватным.

Я бы, наверное, сделал бы так: Input в виде Commons CLI Options, далее преобразование его в класс-структуру настройки (не зависимой от CLI, в случае режима embedded такде заполнение этой структуры) без валидации, статичный фактори метод с этой настройкой, где происходит вся валидации и выставление параметров бизнес объекта.
Ответ написан
KEKSOV
@KEKSOV
«Обычно я пишу так» (с)

1. В конструкторе для все конфигурационных параметров задаются значения по умолчанию
2. Любыми способами — из переменных окружения, аргументов командной строки, кофигурационных файлов и т.п. пытаемся уточнить нашу конфигурацию
3. Создаем метод validate() — только в нем проверяем нашу конфигурацию на валидность и только в нем пишем ошибки, связанные с этим
4. Запускаем основную ветку пограммы

На псевдокоде это выглядит так
service = new TService();
service.loadConfig()
service.validateConfig();
service.doJob();

А в книжке все правильно написано — никаких исключений в конструкторах!
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы