Registro de exceções não registradas no Eclipse

O pior tipo de pessoa escreve código como este:

try {
foo
();
} catch(FooException e)
System.out.println("An exception occurred");
}

Pessoas um pouco menos terríveis podem indicar que foi uma FooException, ou mesmo ir tão longe a ponto de incluir qualquer mensagem na exceção. Mesmo que eles sejam tão inclinados, a própria Exceção, incluindo seu centro de rastreamento de pilha cremoso, é perdida.

Se essa abominação foi perpetrada pelo idiota no corredor, já é ruim o suficiente. Você pode pelo menos prendê-los ao redor da orelha e fazer com que fixem [1]. Mas quando isso é algo que você não pode consertar e reconstruir facilmente, possivelmente um código de terceiros, você está em apuros.

Se você puder conectar o depurador Eclipse à JVM e tiver acesso à fonte, nem tudo está perdido.

  1. Depure o programa
  2. Encontre a exceção
  3. Defina um ponto de interrupção condicional
  4. Execute o código

Depure o programa

Se você estiver escrevendo seu código no Eclipse, apenas execute-o no modo de depuração. Se o código estiver sendo executado fora do Eclipse, consulte Depuração remota de um aplicativo Java

Encontre a exceção

Abra a fonte onde ocorre a exceção e pesquise o texto da mensagem de log. Como alternativa, defina um ponto de interrupção de Exceção e execute o caso de uso incorreto novamente. O Eclipse irá parar quando a exceção especificada for lançada.

Defina um ponto de interrupção condicional

Normalmente, quando você cria um ponto de interrupção, a execução será interrompida sempre que a linha de código for executada. Os pontos de interrupção condicionais são acionados apenas no caso de alguma condição ser atendida, como um parâmetro específico sendo passado para um método.

Essas condições são escritas como Java e avaliadas na JVM. Podemos aproveitar isso para injetar algum código na JVM em execução.

Encontre uma linha de código onde existe o objeto de exceção, por exemplo

System.out.println("An exception occurred");

Defina um ponto de interrupção nesta linha e, a seguir, clique com o botão direito no indicador de ponto de interrupção azul. No menu de contexto, selecione “Propriedades do ponto de interrupção”

Na caixa de diálogo, marque a caixa de seleção Condicional. Isso habilitará a caixa de texto abaixo.

Na caixa de texto, digite o seguinte [1]

LOG.error("Logging exception: " + e.getMessage(), e);
return true;

Execute o código

Agora depure o código que causa a exceção novamente. Desta vez, a condição do breakpoint será avaliada, significando que a exceção será registrada e a execução será pausada. Agora você pode consultar o log para encontrar o rastreamento de pilha que você sempre deveria ter, permitindo que você identifique a origem do problema

Notas de rodapé

1: Assim:

try {
foo
();
} catch(FooException e)
System.out.println("An exception occured while fooing: " + e.getMessage());
e
.printStackTrace();
}

Não foi tão difícil, foi? Se tivesse sido feito assim em primeiro lugar, eu nem teria precisado escrever esta dica.

2: Dependendo do sistema de registro da biblioteca, você pode precisar ajustar isso. O acima pressupõe um logger log4j denominado LOG. Na pior das hipóteses, você provavelmente pode usar o seguinte

System.err.println("Logging exception: " + e.getMessage());
e
.printStackTrace();
return true;