Capturar causa raíz de uma exceção - getRootCause() Exception

4 respostas
CyberX

Hi peoples,

Gostaria de saber se há alguma maneira de capturar a causa raíz de uma exceção onde informe o pacote, classe e linha que ocorre a exceção. Assim como o método getRootCause() da classe ServletException.

→ Há alguma forma de fazer esse processo ?

Segue um exemplo:

public static void main(String[] args) {
		try{
			int c[] = new int[0];
			System.out.println(c[1]);
		}catch(Exception e){
			System.out.println(e.getStackTrace()[0]);
		}
	}

Dessa forma até captura mas não é garantido que em outro tipo de exceção irei ter o mesmo resultado.

Tks.

4 Respostas

CyberX

CyberX:
Hi peoples,

Gostaria de saber se há alguma maneira de capturar a causa raíz de uma exceção onde informe o pacote, classe e linha que ocorre a exceção. Assim como o método getRootCause() da classe ServletException.

→ Há alguma forma de fazer esse processo ?

Segue um exemplo:

public static void main(String[] args) {
		try{
			int c[] = new int[0];
			System.out.println(c[1]);
		}catch(Exception e){
			System.out.println(e.getStackTrace()[0]);
		}
	}

Dessa forma até captura mas não é garantido que em outro tipo de exceção irei ter o mesmo resultado.

Tks.

nel

Isso não é tão simples, não sabe quantos encapsulamentos houveram antes de expurgar a exceção.
Mas dá uma olhada nisso :

Throwable cause = ExceptionUtils.getRootCause(e);

A classe: http://commons.apache.org/lang/api-2.4/org/apache/commons/lang/exception/ExceptionUtils.html
Apache Commons: http://commons.apache.org/

Abraços.

eduardovs

Em Teoria quando existe tratamento de Exceptions voce não tem como garantir a causa.

Exemplo

Class1 Chama Class2
     Class2 Chama Class3
         Class3 Executa Processamento X
        *** 
         Class3 - Lança SQLException
      Class2 - Classe 2 pode capturar no try catch e gerar uma nova exception com outro tipo throw new Exception("ERRO DADOS");
Class1 - Quando classe 1 receber essa exceção ele irá receber ERRO DADOS da classe Exception e não SQLException
R

Eu não entendi qual é a necessidade disso.... mas acho que você vai ter que fazer isso na mão por gambiarrinhas...

try{
			Integer.parseInt("a");
		}catch (Exception e) {
			for(int i = 0; i < e.getStackTrace().length; i++){
				if(ALGUMACLASSE.class.getSimpleName().equals(e.getStackTrace()[i].getClassName())){
					System.out.println("Nome o arquivo: " + e.getStackTrace()[i].getFileName());
					System.out.println("Classe que contém o erro: " + e.getStackTrace()[i].getClassName());
					System.out.println("Método disparou o erro: " + e.getStackTrace()[i].getMethodName());
					System.out.println("Linha que disparou o erro: " + e.getStackTrace()[i].getLineNumber());
				}			
			}
			
			System.out.println("\n");
			for(int i = 0; i < e.getStackTrace().length; i++){
				System.out.println(e.getStackTrace()[i]);
			}
		}
Criado 3 de maio de 2012
Ultima resposta 4 de mai. de 2012
Respostas 4
Participantes 4