Как я должен обрабатывать исключения базы данных и JPA?

Учитывая приведенный ниже метод, как мне поступить с возможными исключениями, которые могут возникнуть? Я хочу оставить отзыв на уровне базы данных и на уровне JPA. Когда возникает нарушение ограничения, я хочу знать, в каком поле. Как бы вы обрабатывали исключения этого метода?

public static <T> void persist(T entity) {
    try {
        em.getTransaction().begin();
        em.persist(entity);
        em.getTransaction().commit();
    } finally {
        if (em.getTransaction().isActive()) {
            em.getTransaction().rollback();
        }
    }
}
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
0
37
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Три разные проблемы

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

реакция

Для ошибки № 1 вы должны отобразить эти исключения во внешнем интерфейсе, ответив пользователю кодом ошибки/статуса 4xx или любой другой визуальной обратной связью.

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

Примеры

  1. Теперь в вашем случае ошибку № 1 добиться труднее.
  2. Примером ошибки № 2 может быть то, что null передается в качестве аргумента или что что-то внутри entity не любит сериализацию. Это случаи, о которых программист должен быть проинформирован.
  3. Для ошибки № 3 есть «диск заполнен» и «база данных отключена» и другие проблемы «аппаратно-недоступно». Те должны пойти в группу обслуживания.

Стратегия

  1. Поместите вызовы по умолчанию, подобные этому, в собственную библиотеку
  2. Создайте собственные исключения, чтобы иметь хотя бы один (базовый) класс для трех случаев. В контексте сервлета вы также можете сопоставить эти исключения с кодом состояния HTTP, который должен быть возвращен во внешний интерфейс.
  3. Расширьте все вызовы в библиотеке, чтобы проверить наличие исключений и создать одно из ваших пользовательских исключений.
  4. На самом высоком уровне реализации возможна обработка исключений. Для сервлетов у меня есть ErrorHandlingServlet extends HttpServlet, и каждый мой сервлет использует это, как в вашем случае, это будет SaveUserServlet extends ErrorHandlingServlet или что-то в этом роде. Затем ErrorHandlingServlet при необходимости отправляет электронное письмо и возвращает код состояния HTTP, включенный в пользовательское исключение.

Личные примеры

Я иду так глубоко, как обычные ParameterInvalidException, ParameterMissingException, EntityNotFoundException. Кроме того, у меня также есть некоторые очень специфические исключения, такие как UsernameNotFoundException (действительно зависит от области применения приложения, хотите ли вы его использовать), или InsufficientRightException (HTTP 401), или EntityStillAttachedException.

Факт

Есть множество тех, которые вы можете приготовить, и вам решать, когда их использовать и как с ними обращаться.

Другие вопросы по теме