Olá!
Como posso criar um capturador de exceptions em tempo de execução?
Por exemplo, durante a execução do programa da um erro qualquer, como o NullPointer, e no lugar da exceção NullPointerException ser chamada, a minha exceção “MyNullPointer” que é requisitada.
Se for desktop:
Thread.setDefaultUncaughExceptionHandler(new Thread.UncaughtExceptionHandler() {
public void uncaughtException(Thread t, Throwable e) {
System.out.println(t + " threw exception: ");
e.printStackTrace();
}
});
Você ainda pode definir um manipulador para uma única thread com o método não estático setUncaughtExceptionHandler da classe Thread.
Se for web, seu servidor já implementa isso. Procure a documentação dele.
Eu costumo capturar a exceção que quero personalizar e “redisparar” uma nova instância da exceção personalizada que quero utilizar.
Exemplificando o seu caso (exemplo em JAVASE):
//Método usado quando o usuário aperta o botão para executar a operação
public void actionPerformed(ActionEvent evt) {
try {
executarOperacao();
} catch (MyNullPointerException e) {
//Tratamento de erro para MyNullPointerException
e.printStackTrace();
}
}
public void executarOperacao() throws MyNullPointerException {
try {
//Código que pode disparar NullPointerException
//...
//...
} catch (NullPointerException e) {
//"Redisparando" uma nova exceção personalizada
throw new MyNullPointerException(e);
}
}
Exemplo com try…catch indentados:
try {
try {
//Código que pode disparar NullPointerException
//...
//...
} catch (NullPointerException e) {
//"Redisparando" uma nova exceção personalizada
throw new MyNullPointerException(e);
}
} catch (MyNullPointerException e) {
//Tratamento de erro para MyNullPointerException
e.printStackTrace();
}
ViniGodoy, obrigado pela resposta!
Foi uma falha minha, desculpe, não ter informado detalhes do projeto, estou trabalhando com web e jsf.
Eu não encontrei formas de criar esse “capturador” no google, mas comecei a pesquisar dentro do próprio jsf e sua documentação, e pra minha surpresa já estava tudo pronto.
O que precisei fazer foi apenas criar uma classe que extende um ExceptionHandler do faces, e configurar essa classe como “defaultHandlerException” no arquivo de configuração applicationContext.xml.
Ao fazer isso, estou conseguindo capturar todos os erros inesperados e/ou não tratados da aplicação.
Mas, estou fazendo um projeto particular em casa, esse sim é desktop, e achei legal essa ideia de capturar erros não tratados, usarei sua dica nele.
Obrigado!
diego_qmota, obrigado pela ajuda!
Isso eu já havia feito, eu já tenho minhas exceções personalizadas e já as utilizo em blocos try…catch.
O que eu queria era capturar exceções que não eram tratadas, e que disparavam em tempo de execução, como por exemplo um nullpointer, ou aritimetic, etç. Sem ter que colocar todo e qualquer código em try…catch.
Um exemplo pode ser mais ou menos esse:
Tenho uma classe que trabalha em cima de instancias de outra classe, e em determinado momento, por qualquer que seja o motivo, essa instancia ficou nula. Se isso ocorrer o usuário irá ver um belo NullPointer na tela, mas capturando os erros em tempo de execução eu posso analisar o que ocorreu e direcionar para outros lugares/telas, além de tentar tratar o erro.
Obrigado!
Reinaldo, como eu falei, geralmente quem faz esse tratamento é o webserver. Algumas APIs tem também um redirecionador. Que web server você está usando?
Movi o seu tópico para a área de desenvolvimento web. Talvez aqui ele tenha mais visibilidade.
[quote=reinaldo558]diego_qmota, obrigado pela ajuda!
Isso eu já havia feito, eu já tenho minhas exceções personalizadas e já as utilizo em blocos try…catch.
O que eu queria era capturar exceções que não eram tratadas, e que disparavam em tempo de execução, como por exemplo um nullpointer, ou aritimetic, etç. Sem ter que colocar todo e qualquer código em try…catch.
Um exemplo pode ser mais ou menos esse:
Tenho uma classe que trabalha em cima de instancias de outra classe, e em determinado momento, por qualquer que seja o motivo, essa instancia ficou nula. Se isso ocorrer o usuário irá ver um belo NullPointer na tela, mas capturando os erros em tempo de execução eu posso analisar o que ocorreu e direcionar para outros lugares/telas, além de tentar tratar o erro.
Obrigado!
[/quote]
Ok Reinaldo… é que pelo enunciado, parecia que você queria fazer algo desse tipo. 