Подтвердить что ты не робот

Четкое объяснение исключения в системе исключения и исключения приложения

Спецификация JPA различает системные исключения и исключения приложений. Я немного смущен тем, где линия рисуется точно. Мой пример:

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

  • Включает ли это все исключения, время выполнения и проверяется независимо от источника?

Системное исключение, вероятно, является исключением, созданным поставщиком непрерывности. Он, безусловно, содержит все подклассы javax.persistence.PersistenceException.

  • Как насчет других исключений, брошенных кодом провайдера?
  • Как насчет исключений, создаваемых другими библиотеками Java EE?
  • Имеет ли значение, если исключение обернуто в EJBException?

Как я могу повлиять на поведение, используя аннотацию ApplicationException? Я никогда не видел, чтобы его использовали.

4b9b3361

Ответ 1

При возникновении бизнес-логической ошибки возникает исключение приложения, а не системная ошибка.

Существует важная разница: исключения приложения не автоматически вызывают откат транзакции. Клиент имеет возможность восстановления после исключения приложения.

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

Включает ли это все исключения, время выполнения и проверяется независимо от того, источник?

Нет. По умолчанию исключения приложений являются исключениями, которые не распространяют RuntimeException или RemoteException. Вы можете изменить это, как описано ниже.

Как я могу влиять на поведение, используя ApplicationException аннотации?

Вы можете использовать @ApplicationException (rollback = true), если вы хотите, чтобы транзакция была откат автоматически.

Вы также можете использовать аннотацию в подклассах RuntimeException и RemoteException, чтобы избежать обертывания как EJBExceptions и определить их поведение автоматического отката.

Как насчет исключений, брошенных другими библиотеками Java EE?

Они будут следовать тем же правилам, но вы можете использовать дескриптор XML для объявления сторонних классов как исключения приложений (с автоматическим откатом или без него).

Как насчет других исключений, выданных кодом провайдера?

Не уверен, я думаю, что вы редко видели не системную ошибку (удаленные или временные исключения), исходящие из кода поставщика.

Имеет ли значение, если исключение обернуто в исключение EJBException?

Да. Это повлияет на то, как вы обрабатываете исключения в клиентском коде.

(Ref: Enterprise JavaBeans 3.0, Bill Burke, O'Reilly)

Надеюсь, это немного поможет.

Ответ 2

Я чувствую, я должен добавить это очень четкое описание, которое Махеш Десаи дал Кодерану:

Любое исключение, являющееся подклассом Exception, но не подклассом RuntimeException и RemoteException - исключение приложения. Все исключения приложений проверяются исключениями, поэтому, когда мы вызываем другой метод в нашем методе, который может вызывать исключение приложения, мы должны либо объявить его в предложении throws метода вызова или поймать его в теле вызывающего метода или и того и другого.

Все системные исключения - это исключенные исключения, кроме RemoteExceptions и он не может быть обработан пользователем.