Olá pessoal eu estou
criando as minhas Exception
mas estou com uma dúvida
que não estou conseguindo resolver
public class AnaliseException extends Exception {
...
public AnaliseException(MensagensDaAnalise msg) {
switch (msg){
case RESULTADO_NEGATIVO:{
//Aqui eu setaria a mensagem no construtor
//para o FacesMessage pegar com o getMessage()???
this.setMessage("Resultado Negativo!");
break;
}
case SALVAR_ANTES_CALCULAR:{
this.setMessage("Impossível Salvar Antes de Calcular!");
break;
}
}
}
...
}
Só que pediu para eu criar o seguinte método na minha
classe:
private void setMessage(String msg) {
//eu pensei em passar essa msg para o super(msg);
//mas não deu certo também.
//para aonde que eu vou mandar essa mensagem???
}
Será que alguém poderia me dar uma ajuda?
Fazendo o Favor?
Exato… faça como a lina falou pra voce fazer como eu falei pra fazer.
Brincadeiras a parte.
Realmente não existe um método setMessage tanto em Exception nem em Throwable, então voce não consegue alterar (Bem… voce pode alterar por Reflection mas acho exagero isso).
E de qualquer modo evitar switchs é mais interessante. Fora o fato de que se voce precisar de mais uma MensagensDeAnalise voce precisa alterar apenas o enum e não criar uma nova clausula no switch.
[quote=Mark_Ameba]Exato… faça como a lina falou pra voce fazer como eu falei pra fazer.
Brincadeiras a parte.
Realmente não existe um método setMessage tanto em Exception nem em Throwable, então voce não consegue alterar (Bem… voce pode alterar por Reflection mas acho exagero isso).
E de qualquer modo evitar switchs é mais interessante. Fora o fato de que se voce precisar de mais uma MensagensDeAnalise voce precisa alterar apenas o enum e não criar uma nova clausula no switch.[/quote]
Eu pessoalmente não trataria exception assim. Criaria uma exceptin ResultadoNegativoException, SalvarAntesDeCalcularException e por ai vai. Um exemplo é como o spring JDBC Templete trabalha, lançando unchecked exception bem explicativas como por exemplo OptimisticLockingFailureException, DataAccessException.
Claro que há quem faça da forma citada, como por exemplo todas as SQLException, que retornam o erro na mensagem, mas sei lá prq resolvi postar como é a minha preferencia.
A vantagem da solução do Mark_Ameba sobre a sua, na minha opinião, é que para adicionar uma nova mensagem vc não precisa alterar a classe AnaliseException, colocando mais um case no switch, é que uma estrutura muito sugeita a erros, como por exemplo vc esquecer um break da vida. Na minha opinião as vantagens, nesse caso, são semelhantes a vc trocar um monte de if por polimorfismo.
Fica mais facil se vc precisa trocar uma mensagem vc vai direto no enum e não precisa ficar olhando procurando qual é o seu case correto a ser alterado.
[quote=lina][quote=Mark_Ameba]Exato… faça como a lina falou pra voce fazer como eu falei pra fazer.
Brincadeiras a parte.
Realmente não existe um método setMessage tanto em Exception nem em Throwable, então voce não consegue alterar (Bem… voce pode alterar por Reflection mas acho exagero isso).
E de qualquer modo evitar switchs é mais interessante. Fora o fato de que se voce precisar de mais uma MensagensDeAnalise voce precisa alterar apenas o enum e não criar uma nova clausula no switch.[/quote]
Oi,
Porque ninguém gosta do switch?!
Tchauzin![/quote]
Fora que ele é comprovadamente mais lento. E código OO é mais “bonito” de se ler.^^
O problema é que exceptions não devem ser feitas com switch. Ou a mesnagem é “erro negativo” ou não é. Não tem essa de decidir que messagem usar.
melhor ainda é criar subexceções conforme o caso especifico que se quer tratar.
Eu concordo com vc mas muitas apis não seguem sua dicas como por exemplo JDBC, com a famosa SQLException. Servlets, quando tem erro na pagina jsp e é lançada sempre um JasperException (não me lembro se é assim que escreve) e por ai vai.