Olá!
Infelizmente o tratamento de exceções no JSF (JavaServer Faces) não é tão fácil quanto no Struts, enquanto no Struts o tratamento é feito de forma declarativa no struts-config.xml(eu acho mais fácil tratar dessa forma), no JSF é programático, ou seja você escreve o código que trata a exception para mostrar a mensagem correta na página. Geralmente isso é feito diretamente no Managed Bean usando blocos try…catch.
Quando você espera uma exception é intuitivo colocar um bloco try..catch e escrever o código para mostrar uma mensagem na página. Mas e se der um NullpointerException ou alguma outra RuntimeException?
Tratar essas exceptions no JSF de forma genérica não é fácil. Eu consegui fazer isso criando uma classe herdando de ActionListenerImpl, sobreescrevendo o método processAction e incluindo uma chamada ao método processAction() da classe pai dentro de um bloco try…catch. Dentro desse catch é feito um addMessage() com a mensagem a ser mostrada e também é feito o redirecionamento para a página de erro.
Outro problema é que o FacesMessage não suporta a internacionalização de mensagens, por isso foi criada a I18nFacesMessage que implementa esse recurso.
O exemplo do JSF (JavaServer Faces) – Exception Handler pode baixado clicando aqui.
Esse projeto foi feito no Eclipse 3.3 Europa, basta utilizar o recurso de import dele para poder rodar ele.
Utilize o Tomcat 6.0.16.
Até mais,
Roberto
Você tem razão, infelizmente JSF até a versão 1.2 não possui um Exception Handler, logo somos obrigados a implementar o nosso próprio handler.
Existem várias maneiras de se resolver esse problema, eu, por exemplo, já me substitui o FacesServlet pelo meu próprio, o que funcionou bacana.
Hoje em dia a melhor solução que vejo é implementando algum tipo de interceptor como um PhaseListener na fase INVOKE_APPLICATION ou AOP com Spring [caso utilize JSF integrado ao Spring].
Parabéns pelo post, espero que não deixe de postar sobre JSF.
Abraços.
O link acima do exemplo estar indisponível
Link corrigido!