[Resolvido] Exceptoon.getMessage Formatado

Bom, não sei se escolhi o melhor nome para o tópico, mas vou tentar explicar exatamente o que eu quero fazer.

Eu quero usar o getMessage() nas Exceptions pra mostrar o erro pro usuário (eu seto erros bastante descritivos onde as exceptions são lançadas). Na maioria das vezes funciona como eu quero e o resultado é

“Erro no campo X, por favor preenche com um valor válido.”

Porém, quando a exception foi repassada (ou relançada) por uma outra camada, o getMessage() fica assim.

br.com.guj.exception.BusinessException: Erro Interno: Erro no campo X, por favor preenche com um valor válido.

Isso é “resolvido” usando getCause().getCause() infinitamente até achar o getMessage(). Porém isso fica MUITO feio.

Como, meus amigos, vocês sugerem que eu faça pra ter apenas a frase da mensagem, sem o nome da classe aparecendo.

Obrigado =)

E ae cassionandi!

Eu acredito que seria legar você criar um arquivo de properties que contenha a exception e o tipo de mensagem que vc quer que seja apresentada na tela.

Valeu!

Hmm, deixa eu ver se entendi.

exception.properties

BusinessException=Erro no campo X, por favor preenche com um valor válido

É isso?

O problema nisso é que eu uso o mesmo tipo só mudando as mensagens. BusinessException no meu ver (e dentro da função que atribui dentro do meu sistema) simboliza exções lançadas dentro das regras e lógica de negócio. Então eu teria que criar muitos tipos de Exceções…

Eh, vc deveria fazer algo mais internacionalizavel, as mensagens estarem em algum arquivo properties por exemplo, nao que a melhor forma seja mapear: Excecao=mensagem

De qualquer forma, vc provavelmente esta lancando um BusinessException e depois algo esta encapsulando ela dentro de outra excecao (que eh a que vc recebe), essa outra excecao deve estar dessa forma:

public class OutraException extends Exception {

	private static final long serialVersionUID = 1L;

	public OutraException() {
		super();
	}

	public OutraException(String message, Throwable cause) {
		super(message, cause);
	}

	public OutraException(String message) {
		super(message);
	}

	public OutraException(Throwable cause) {
		super(cause);
	}
}

Se tiver assim, muda para isso:

public class OutraException extends Exception {

	private static final long serialVersionUID = 1L;

	public OutraException() {
		super();
	}

	public OutraException(String message, Throwable cause) {
		super(message, cause);
	}

	public OutraException(String message) {
		super(message);
	}

	public OutraException(Throwable cause) {
		super(cause.getMessage(), cause);
	}
}

Repare que mudou apenas o construtor OutraException(Throwable cause).

Porem, ao inves de lancar tudo BusinessException, eu acharia melhor vc lancar excecoes diversas, algo que a partir da excecao diga para quem esta usando suas classes de modelo o que ocorreu, e entao poder criar uma mensagem especifica, ou no maximo um BusinessException que retorne um codigo de erro, e a partir desse codigo a camada que usa o modelo ter um properties mapeando codigo=mensagem.
Eh como eu geralmente faco…

Fala Luiz, obrigado pela dica e pela atenção viu.

Implementei a class BusinessException da forma como você falou e ficou como eu queria.
Só pra constar, atualmente já utilizo um propertie pra mensagens do sistema todo, inclusive das Exceptions como você disse usar.

Mais uma vez obrigado e abraço!