excecao.xml
6.31 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
<?xml version='1.0' encoding="utf-8"?>
<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
"http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" []>
<chapter id="excecao">
<title>Exceções</title>
<para>
Esta funcionalidade foi feita para você que acha muito verboso encher o código de <literal>try/catch</literal>.
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.
</para>
<section>
<title>Configurando</title>
<para>
Para um correto funcionamento do Demoiselle é necessário inserir o interceptador de exceção no arquivo <filename>src/main/WEB-INF/beans.xml</filename>.
</para>
<programlisting role="XML"><![CDATA[<beans xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/beans_1_0.xsd">
<interceptors>
<class>br.gov.frameworkdemoiselle.exception.ExceptionHandlerInterceptor</class>
</interceptors>
</beans>]]></programlisting>
</section>
<section>
<title>Tratadores de exceção</title>
<para>
Para definir um tratador de exceção, basta anotar o método com <literal>@ExceptionHandler</literal>.
O tratamento de exceções só é possível em classes anotadas com <literal>@Controller</literal> ou os derivados
desta anotação. Para ver mais detalhes sobre controladores no Demoiselle, leia o capítulo <link linkend="controlador">Controladores</link>.
</para>
<programlisting role="JAVA"><![CDATA[@Controller
public class Simples {
@ExceptionHandler
public void tratador(NullPointerException cause) { }
public void inserir() { }
public void alterar() { }
public void excluir() { }
}]]></programlisting>
<para>
Neste exemplo, qualquer exceção do tipo <literal>NullPointerException</literal> que ocorrer nos métodos
da classe <literal>Simples</literal> terá o tratamento delegado para o método <literal>tratador()</literal>.
Para as exceções não tratadas, o comportamento seguirá o padrão da linguagem.
</para>
</section>
<section>
<title>Múltiplos tratadores</title>
<para>
Não se limite a apenas um tratador por classe, você pode ter vários.
</para>
<programlisting role="JAVA"><![CDATA[@Controller
public class Simples {
@ExceptionHandler
public void tratador(NullPointerException cause) { }
@ExceptionHandler
public void tratador(AbacaxiException cause) { }
public void inserir() { }
public void alterar() { }
public void excluir() { }
}]]></programlisting>
<para>
Caso as exceções <literal>NullPointerException</literal> ou <literal>AbacaxiException</literal> ocorram
nos métodos da classe <literal>Simples</literal>, o tratamento será delegado para o seu tratador.
</para>
</section>
<section>
<title>Misturando os dois mundos</title>
<para>
É possível que, em determindas situações no seu projeto, você precise misturar o tratamento sofisticado com a
tradicional forma verbosa. Como fazer isso?
</para>
<para>
Suponha que no método <literal>inserir()</literal> você precise dar um tratamento exclusivo para uma exceção.
Para isso, misture as duas abordagens para atingir o seu objetivo.
</para>
<programlisting role="JAVA"><![CDATA[@Controller
public class Simples {
@ExceptionHandler
public void tratador(NullPointerException cause) { }
public void inserir() {
try {
// tenta algo
} catch (AbacaxiException cause ) {
// trata o problema
}
}
public void alterar() { }
public void excluir() { }
}]]></programlisting>
<para>
Neste caso a exceção <literal>AbacaxiException</literal> só será tratada no método <literal>inserir()</literal>.
</para>
</section>
<section>
<title>Exceção de Aplicação</title>
<para>
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
<emphasis>rollback</emphasis>. 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 <literal>@ApplicationException</literal>.
Utilize-a em suas exceções e informe os atributos <literal>rollback</literal> e <literal>severity</literal> para alcançar os objetivos acima.
</para>
<programlisting role="JAVA"><![CDATA[@ApplicationException(rollback=true, severity=SeverityType.INFO)
public class MinhaException extends Exception {
}]]></programlisting>
<para>
No exemplo citado acima, estamos informando que caso esta exceção seja lançada por um método anotado com <literal>@Transactional</literal>, 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 <literal>rollback</literal> é realizar o rollback sempre que a exceção for lançada.
O grau de severidade padrão é informativo (<literal>INFO</literal>).
</para>
</section>
<section>
<title>Tratamento Padrão</title>
<para>
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.
</para>
<para>
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 <literal>@ApplicationException</literal>, um <emphasis>rollback</emphasis> é 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 <literal>ERROR</literal>.
</para>
</section>
</chapter>