Dúvida Exception [RESOLVIDO]

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?

[]'s.

Voce poderia alterar esse enum para enviar a mensagem também algo como:

public enum MensagensDaAnalise{
ResultadoNegativo("Resultado Negativo!"),
SalvarAntesCalcular("Impossível Salvar Antes de Calcular!");
private MensagensDaAnalise(String msg){
this.msg = msg;
}
private String msg;
public String getMsg(){
return msg;
}
}

E sua Exception seria assim

public class AnaliseException extends Exception {
...
public AnaliseException(MensagensDaAnalise msg) {
super(msg.getMsg());
           }
    }
...
}

Repare que eliminei o Switch desse jeito. É uma boa pratica de programação.

Oi,

Na verdade você fez um Override deste método. Você poderia utilizar o super.setMessage() passando a msg por parâmetro.

Tchauzin!

Oi lina eu estava tentando fazer isso:

case RESULTADO_NEGATIVO:{               
       super.setMessage("Resultado Negativo!");
       break;
}

Mas parece que não tem como
eu usar o método setMessage
através do super. Esta dando
erro aqui lina.

[]'s.

Oi,

Então… é porque você está estendendo a classe Exception e ela não possui o método setMessage().

Você só irá conseguir executar o comando super.<nome_do_metodo> se na classe superior (pai) existir este método.

A explicação do Mark está correta e funcional… você tentou fazer como ele disse?

Tchauzin!

Obrigado lina e Mark pela ajuda eu
vou tentar fazer igual o mark
deu a dica lina.

Obrigado a vc’s dois pela ajuda.

[]'s.

Exato… faça como a lina falou pra voce fazer como eu falei pra fazer. :stuck_out_tongue:

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. :stuck_out_tongue:

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?! :cry:

Tchauzin!

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. :stuck_out_tongue:

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?! :cry:

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.

Siga as regras para criação de exceções e não invente.

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. :frowning:

Olá pessoal,
acabei fazendo o que o Mark falou
e só fiquei meio em dúvida na hora
de lançar a exception é só fazer isso?

catch(SQLException ex){
      ex.printStackTrace();
      throw new AnaliseException(MensagensDaAnalise.ResultadoNegativo);
}

[]'s.

Isso mesmo.

Obrigado pessoal
a todos pela ajuda. :smiley:

Agora deu certo aqui.

Abraço a todos.