Как обработать исключение, которое выдается при закрытии соединения в блоке finally? - PullRequest
0 голосов
/ 13 марта 2020

Итак, сценарий заключается в том, что я делаю некоторые операции с базой данных и, наконец, фиксирую / откат, а затем закрываю соединение Но закрытие соединения также выдает SQLException.

В этом сценарии, что является лучшим подходом?

  1. перехватывает и регистрирует его.
  2. перехватывает и выдает исключение так, что вызывающая функция может с этим справиться

В случае # 1 вызывающая функция никогда не узнает, что что-то пошло не так.

Ответы [ 2 ]

0 голосов
/ 13 марта 2020

На это распространяется одно из базовых c правил объектной ориентации, называемое «Инкапсуляция», которое настаивает на том, чтобы мы не раскрывали внутреннее состояние класса его соавторам. Влияние этой проблемы на вашу проблему состоит в том, что должным образом учтенный класс не должен распространять SQL исключений на класс, использующий его (который обычно находится на более высоком уровне).

Чтобы быть точным, ограничение состоит в том, что вы бы не выставили SQL классы на более высокий уровень, а в случае 3-уровневого приложения можно было бы ожидать, что более высокий уровень будет содержать бизнес-логику c. Бизнес-логика c не должна ничего знать о SQL - для этого нужен слой базы данных / хранилища. Таким образом, все SQL исключения должны быть переведены на границе уровня.

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

В Java мы часто гарантируем, что мы неправильно выставляем состояние, например SQL осведомленность, различным слоям, создав отдельный файл jar (модуль maven). ) на слой, чтобы мы могли контролировать зависимости слоя. Если мы не добавим библиотеку SQL в качестве зависимости от библиотеки business-logi c, то мы получим ошибки компиляции, если будем ссылаться на нее в этом слое.

Итак, чтобы полностью ответить на ваш вопрос, уровень хранилища должен иметь дело с соединениями с базой данных, и клиент этого уровня, бизнес-логика c, не должен знать об ошибках SQL. Вы должны захватить исключение и решить, что с ним делать в коде базы данных. Если вы не можете принять правильное решение, вы должны создать исключение для абстракций более высокого уровня (business-logi c), чтобы иметь дело с ним. Как вы решаете проблему с указанным c, зависит от конкретного приложения; если передача была передана, и вы запускаете однопоточный микросервис в docker контейнере, вы можете просто зарегистрировать проблему и уничтожить контейнер, но если вы используете приложение GUI, которое требует при постоянном подключении к БД вы можете выдать пользовательское исключение «подключения» к слою business-logi c, которое может генерировать исключение, которое перехватывается пользовательским интерфейсом для отображения проблемы пользователю для разрешения.

0 голосов
/ 13 марта 2020

Я думаю, вы сами ответили: 2. поймать и выдать исключение, чтобы вызывающая функция могла его обработать. Помогает ли это?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...