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.