Nesse post vou mostrar uma forma de pergar um erro mais específico a partir de uma Exception (nesse caso uma PersistenceException mas poderia ser qualquer outra). Estou assumindo que estamos em uma aplicação JSF e tentamos persistir uma informação que já existe no banco de dados e acaba violando uma constraint, então queremos exibir uma mensagem mais precisa ao usuário. Podemos fazer da seguinte forma:
... //declaração da classe e outras propriedades e métodos
private static final String MENSAGEM_PADRAO = "Não conseguimos consultar as informações, favor informar a área de negócio responsável.";
...
try{
... //seu código
}catch ...{ //outros blocos catch
}catch (final PersistenceException e) {
Exception cause = e;
Integer count = 0;
while (cause != null && cause.getMessage() != null
&& cause.getMessage().contains("NOME_CONSTRAINT_BANCO")
|| count == 10)
{
if ( cause != null )
{
cause = (Exception) cause.getCause();
}
count += 1;
}
String mensagem = null;
if ( cause != null && cause.getMessage() != null
&& cause.getMessage().contains("NOME_CONSTRAINT_BANCO") )
{
mensagem = gerarMensagem("Sua mensagem");
FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(
FacesMessage.SEVERITY_ERROR, mensagem, null));
}
mensagem = gerarMensagem(
MENSAGEM_PADRAO);
FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(
FacesMessage.SEVERITY_ERROR, mensagem, null));
}
}catch (final Exception e)
{
...
}