Sobrescrevendo Java Exceptions

11 respostas
neveslucas

Opa,

Esse é meu primeiro post, então se tiver algo errado me avisem.

Estou implementando um sistema transparente de Log em um sistema que está sendo migrado de C# para Java, e resolvi utilizar o Log4J. Até aí tudo bem.

Acabou que terei que implementar classes de Exceção customizadas, que extenderão de uma Exceção customizada, assim:

[list]MyException - extends Exception;[/list]
[list]MySQLException - extends MyException;[/list]
[list]MyBUSException - extends MyException;[/list]
[list]MyIOException - extends MyException;[/list]

(obs: Estou testando com RuntimeException e Exception, pois precisarei dos dois…)

Então dentro de MyException fiz o tratamento com logging usando o Log4j.

Tudo parece funcionar corretamente, exceto pelo fato de que quando uso o try/catch, a excecão não é tratada, ou seja, ele apenas faz o try, e ignora o catch.

try{
     algo impossível;
}catch(MyException e){
     System.err.("Melou!");
}

No construtor da classe MyException coloquei um Sysout e não passa lã mesmo.

== Finalmentes…

Então, acabei fazendo isso porque não descobri como fazer um Override da classe Exception do Java, fiz isso no Ruby uma vez, mas não descobri como fazer no java, não achei nada nos livros nem na net.

Se alguém souber como fazer o Override, ou porquê meu catch não está pegando nada, plz help.

Valeu pessoal.

11 Respostas

pmlm

O teu “algo impossivel” faz throw da MyException?

J

Então quando tenho que customizar Exceptions faço da forma mais clara .

no seu método coloca o throws ex:

public void Cadastrar(String nome,String rg,String cpf,)throws SQLException,Exception{

e no try/catch cria uma variavel de String e coloca o erro ai quando acontecer alguma coisa e cair no catch usa o seguinte código.

}catch(SQLException sql){ erro = "Ocorreu um erro - MySQL"; sql.printStackTrace(); throw new SQLException(erro); }catch(Exception ex){ erro = "Ocorreu um erro"; ex.printStackTrace(); throw new Exception(erro); }

Essa é uma solução simples de customizar Exceptions !!!

Espero ter ajudado !!

[]'s

Lavieri

eu aconselho a vc essa leitura aki, antes de embarcar no tratamento de exceções… e bom ter os conceitos na mente de forma boa… pq esse assunto não é de todo facil, e o bom tratamento faz muita diferença para uma aplicação…

Exceções: Conceitos
Exceções: Boas Práticas, Más Práticas
Exceções: Classes Utilitárias

leia na mesma sequencia q coloquei aki… garanto que apos a leitura as duvidas vão se elucidar, e pode ter certeza que vc não perdera tempo lendo, ganhara conhecimento…

Lavieri

jrtl6:
Então quando tenho que customizar Exceptions faço da forma mais clara .

no seu método coloca o throws ex:

public void Cadastrar(String nome,String rg,String cpf,)throws SQLException,Exception{

e no try/catch cria uma variavel de String e coloca o erro ai quando acontecer alguma coisa e cair no catch usa o seguinte código.

}catch(SQLException sql){ erro = "Ocorreu um erro - MySQL"; sql.printStackTrace(); throw new SQLException(erro); }catch(Exception ex){ erro = "Ocorreu um erro"; ex.printStackTrace(); throw new Exception(erro); }

Essa é uma solução simples de customizar Exceptions !!!

Espero ter ajudado !!

[]'s

isso não é uma solução de tratamento… muito menos uma customização de exceções… é apenas uma gambiarra O.o … e mau feita, so vai fazer espalhar stacktrace sem tratar nada, e vai lançar a exceção pra outro canto, ou seja… mesmo que alguem trate a exceção em outro lugar, ela ja vai estar esparramada na saida o.O

e o pior é que a exceção original a que realmente causou o problema vai ser perdida… pq vc agarrou, não fez nada com ela, e lançou outra exceção, q nada tinha a ver com a 1°

neveslucas

isso não é uma solução de tratamento…
…e o pior é que a exceção original a que realmente causou o problema vai ser perdida…

Concordo com você nesses pontos, você realmente entendeu o que eu quero fazer.

Qual a solução que você propõe?

Sabe como customizar as Exceções ou sobrescrevê-las?

GraveDigger

neveslucas:
isso não é uma solução de tratamento…
…e o pior é que a exceção original a que realmente causou o problema vai ser perdida…

Concordo com você nesses pontos, você realmente entendeu o que eu quero fazer.

Qual a solução que você propõe?

Sabe como customizar as Exceções ou sobrescrevê-las?

Não entendi exatamente o que vc deseja Lucas.

Pode falar um pouco mais a respeito? Acredito que um melhor entendimento por parte do pessoal vá facilitar que o ajudemos.

Abs

neveslucas

Eu quero fazer um Override da classe Exception do Java.

Não Override de método, e sim um Override de uma classe inteira, que aconteça somente no escopo do Jar em questão.

Sei que no Ruby é possível, pois já fiz, mas não encontrei nenhum material sobre isso no Java.

GraveDigger

neveslucas:
Eu quero fazer um Override da classe Exception do Java.

Não Override de método, e sim um Override de uma classe inteira, que aconteça somente no escopo do Jar em questão.

Sei que no Ruby é possível, pois já fiz, mas não encontrei nenhum material sobre isso no Java.

Certo, só pra confirmar:

Vc quer alterar o comportamento das exceções padrão do java(colocando algo no construtor, pelo que vc citou) mas sem criar um decorator para isso, certo?

Se for esse seu caso, acredito q não é possível, ao menos não de uma maneira fácil.

Talvez com aspectos vc consiga interceptar as exception e adicionar o comportamento desejado a elas.

Explique melhor o motivo pelo qual vc quer fazer isso, fale um pouco mais sobre sua idéia geral, não do recurso específico que vc gostaria.

Há várias formas diferentes de alcançar o mesmo objetivo, se nós tivermos uma idéia mais profunda do seus fica mais fácil sugerir os caminhos viáveis pelo Java.

Abs

celso.martins

Você não disse se isso ajudou:

http://www.javafree.org/viewtopic.jbb?t=873213

T

Tenho esse try, queria saber como que faço pra tratar um eventual erro, usando a Exception, mas quando houver esse erro o cursor voltar para codAlunofield(jtextField) pra o usuario digite novamente!! Alguem pode me ajudar???

try {

queryAluno = entityManager.createNamedQuery(Aluno.findByCodaluno);

queryAluno.setParameter(codaluno, Integer.parseInt(codAlunofield.getText()));

listAluno = queryAluno.getResultList();

nomeAlunoField.setText(listAluno.get(0).getNome());

cpfAlunoField.setText(listAluno.get(0).getCpf());

} catch ( Exception e) {

JOptionPane.showMessageDialog(null, Ocorreu um erro, use apenas numeros!);

e.printStackTrace();

codAlunofield.requestFocus();
}
T

Tenho esse try, queria saber como que faço pra tratar um eventual erro, usando a Exception, mas quando houver esse erro o cursor voltar para codAlunofield(jtextField) pra o usuario digite novamente!! Alguem pode me ajudar???

try {

queryAluno = entityManager.createNamedQuery(Aluno.findByCodaluno);

queryAluno.setParameter(codaluno, Integer.parseInt(codAlunofield.getText()));

listAluno = queryAluno.getResultList();

nomeAlunoField.setText(listAluno.get(0).getNome());

cpfAlunoField.setText(listAluno.get(0).getCpf());

} catch ( Exception e) {

JOptionPane.showMessageDialog(null, Ocorreu um erro, use apenas numeros!);

e.printStackTrace();

codAlunofield.requestFocus();
}
Criado 18 de maio de 2009
Ultima resposta 8 de nov. de 2012
Respostas 11
Participantes 7