Utilizando o Exception Interceptor você poderá mapear suas exceções por tipo(ex: java.sql.Exception) e usar uma página definida para a exceção correspondente.
Para isso criaremos um global-result.
<global-results>
<result name="error">/jsp/Error.jsp</result>
</global-results>
Mas por que global?
Bem, porque muito provavelmente você queira esse mapeamento disponível para todas as actions do seu package(lembrando que o package nesse caso é a diretiva do arquivo struts.xml e não o package foo.bar.actions de sua aplicação).
O que faremos agora é associar nosso result com a exceção desejada, como podemos ver no snippet abaixo:
<global-exception-mappings>
<exception-mapping exception="java.lang.Exception" result="error"/>
</global-exception-mappings>
Graças a nossa amiga ValueStack ainda podemos exibir mais detalhes sobre a exceção lançada em nosso erro.jsp.
<p>Exception: <s:property value="exception" /></p>
<p>stack trace: <s:property value="exceptionStack" /></p>
Mas você pode estar se perguntando, como isso ocorre?
O Exception Interceptor está no topo da pilha de interceptors do Struts 2, isso me traz a tranquilidade de que ele possa manipular as exceções em qualquer fase de invocação da action em questão.
Em outras palavras estando no topo da pilha o Exception Interceptor tem o poder de agir desde os primeiros movimentos da ActionInvocation (preprocessing) até o fim de sua atividade (postprocessing).
Espero que seja de bom proveito ;)