2010-12-31 4 views
9

정보를 스택 추적/예외에 추가하고 싶습니다. 기본적으로 내가 정말 좋아 지금 같은 이런 일을 가지고예외 정보 추가

: 나는 여전히 원래 스택을하면서, 그 예외를 잡아에 추가로 정보를 추가 할 그러나

Exception in thread "main" java.lang.ArithmeticException:/by zero 
    at com.so.main(SO.java:41) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke 

자취.

예를 들어, 나는 그것을 가지고 싶습니다

Exception in thread "main" CustomException:/by zero (you tried to divide 42 by 0) 
    at com.so.main(SO.java:41) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke 

을 그래서 기본적으로 내가 을 첨가 arithmeticexception이와 다시 throw, 말하는 CustomException을 (잡으려면를 "당신은 (는) 0 (42)을 분할하는 시도" 이 예제에서는 스택 추적을 원본 ArithmeticException에서 계속 유지합니다.

Java에서이 작업을 수행하는 올바른 방법은 무엇입니까?

try { 
    .... 
} catch (ArithmeticException e) { 
    throw new CustomException("You tried to divide " + x + " by " + y, e); 
} 
+0

예외를 던진 사람이 아닌 경우 어떻게 예외 사실을 알 수 있습니까? – Falmarri

+0

@Falmarri : 특수성을 모르지만 메소드 매개 변수와 같은 추가 정보를 추가 할 수 있습니다. 내 질문 끝에 예제를 추가했습니다. – NoozNooz42

+0

일반적으로이 정보는 디버깅에만 유용합니다. 또한 디버거를 사용하여 프로그램을 디버깅하고 예외에 중단 점을 배치 할 수 있습니다. 예외가 발생하면 원인이 된 조건이 표시됩니다. –

답변

11

예, 할 수 있습니다 자바 1.4의 자바에서 같은 둥지 예외 :

올바른 다음입니다. 나는 항상 이것을한다. http://download.oracle.com/javase/1.4.2/docs/api/java/lang/Throwable.html을 참조하십시오.

사용자 정의 예외에서 스택 추적을 인쇄하면 CustomException 스택 추적과 중첩 된 ArithmeticException의 스택 추적이 모두 표시됩니다. 임의로 깊이 중첩 할 수 있습니다.

+0

+1, 고마워. 재미 있기 때문에 오랜만에 거기에있어 :) – NoozNooz42

+0

링크가 [Sad face] – meawoppl

10

또한이 작업을 수행 할 수 있습니다 :

당신을 줄 것이다
try { 
    .... 
} catch (ArithmeticException e) { 
    ArithmeticException ae = new ArithmeticException("You tried to divide " + x + " by " + y+" "+e.getMessage()); 
    ae.setStackTrace(e.getStackTrace()); 
    throw ae; 
} 

업데이트 [27 9 월 2012] :-) "보이지 않는"예외 : 자바 7에서

: 다른 멋진 트릭은 다음과 같습니다.

try { 
    ... 
} catch (ArithmeticException e) { 
    e.addSuppressed(new ArithmeticException("You tried to divide " + x + " by " + y)); 
    throw e; 
} 
+0

+1으로 너무 죽었습니다. "보이지 않음"을 사용하면 두 개가 아닌 하나의 스택 추적 만있을 것입니다. – NoozNooz42

+1

나는 대답을 편집 할 수 없다. (나는 충분한 담당자가 없다.)하지만 잘라 내기/붙여 넣기를하고 ArithmeticException을 생성하는 행의 끝에서 제거해야하는 *, e "*를 남겼다고 생각한다. – NoozNooz42

+0

예 스택 트레이스가 단 하나입니다. 그리고 오류를 알아 줘서 고마워. – Pat