Exceções
Esta funcionalidade foi feita para você que acha muito verboso encher o código de try/catch.
E o que dizer de repetir o tratamento de exceções em vários métodos da mesma classe na base do copiar/colar?
Oferecemos a você uma alternativa para resolver estes problemas, mas você estará livre para usá-la: isoladamente,
misturando com a forma verbosa ou até mesmo não usá-la.
Configurando
Para um correto funcionamento do Demoiselle é necessário inserir o interceptador de exceção no arquivo src/main/WEB-INF/beans.xml.
br.gov.frameworkdemoiselle.exception.ExceptionHandlerInterceptor
]]>Tratadores de exceção
Para definir um tratador de exceção, basta anotar o método com @ExceptionHandler.
O tratamento de exceções só é possível em classes anotadas com @Controller ou os derivados
desta anotação. Para ver mais detalhes sobre controladores no Demoiselle, leia o capítulo Controladores.
Neste exemplo, qualquer exceção do tipo NullPointerException que ocorrer nos métodos
da classe Simples terá o tratamento delegado para o método tratador().
Para as exceções não tratadas, o comportamento seguirá o padrão da linguagem.
Múltiplos tratadores
Não se limite a apenas um tratador por classe, você pode ter vários.
Caso as exceções NullPointerException ou AbacaxiException ocorram
nos métodos da classe Simples, o tratamento será delegado para o seu tratador.
Misturando os dois mundos
É possível que, em determindas situações no seu projeto, você precise misturar o tratamento sofisticado com a
tradicional forma verbosa. Como fazer isso?
Suponha que no método inserir() você precise dar um tratamento exclusivo para uma exceção.
Para isso, misture as duas abordagens para atingir o seu objetivo.
Neste caso a exceção AbacaxiException só será tratada no método inserir().
Exceção de Aplicação
Imagine que você precise informar que, caso um determinado tipo de exceção seja lançado através do seu método, a transação atual sofrerá um
rollback. Ou, então, que haja necessidade de informar o grau de severidade da exceção, de forma que uma camada de apresentação
específica a trate de forma diferenciada. Estas duas opções são possíveis através do uso da anotação @ApplicationException.
Utilize-a em suas exceções e informe os atributos rollback e severity para alcançar os objetivos acima.
No exemplo citado acima, estamos informando que caso esta exceção seja lançada por um método anotado com @Transactional, este
método sofrerá um rollback. Ao mesmo tempo, sua camada de exibição apresentará uma mensagem automática para o usuário, conforme o nível de severidade.
O comportamento padrão para o rollback é realizar o rollback sempre que a exceção for lançada.
O grau de severidade padrão é informativo (INFO).
Tratamento Padrão
As exceções lançadas a partir da camada de negócio, ou de persistência, não causam a interrupção de sua aplicação, muito menos apresentam a tela
padrão de erro do JSF ou de outra tecnologia de visão. Qualquer exceção lançada que chega até a camada de apresentação recebe um tratamento
especial. Inicialmente, ela é encapsulada de forma que possa ser exibida de forma elegante para o usuário. No caso do JSF, é utilizado o mecanismo
de Messages próprio desta tecnologia.
No caso do Vaadin, o tratamento é bem semelhante, contudo a exceção é tratada de forma que possa ser exibida adotando os mecanismos próprios da
tecnologia. No caso de exceções que não usam a anotação @ApplicationException, um rollback é realizado
de forma automática. Por último, sem o uso desta anotação, toda exceção é vista como tendo nível de gravidade igual a ERROR.