Criar "capturador" de exceptions

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