예외의 스택 추적 인쇄


81

stderr 이외의 스트림에 예외의 스택 추적을 어떻게 인쇄합니까? 내가 찾은 한 가지 방법은 getStackTrace ()를 사용하고 전체 목록을 스트림에 인쇄하는 것입니다.


예외 추적을 String으로 가져 오려면 하나의 String으로 결합 할 수 getStackTrace있는 StackTraceElement개체 배열을 반환하는 Trowable (Exception) 메서드를 호출 할 수 있습니다 (해당 개체의 toString 메서드를 사용하여 추적 한 줄을 가져옴).
jcubic

답변:


61

Throwable.printStackTrace(..)PrintWriter또는 PrintStream인수를 취할 수 있습니다 .

} catch (Exception ex) {
    ex.printStackTrace(new java.io.PrintStream(yourOutputStream));
}

즉, LOGBack 또는 log4j 와 같은 로깅 구현과 함께 SLF4J 와 같은 로거 인터페이스를 사용하는 것이 좋습니다 .


77

아름답지는 않지만 그럼에도 불구하고 해결책 :

StringWriter writer = new StringWriter();
PrintWriter printWriter = new PrintWriter( writer );
exception.printStackTrace( printWriter );
printWriter.flush();

String stackTrace = writer.toString();

3
이것은 내가 필요한 것입니다 (나는 그것을 사용하여 정말 더러운 느낌에도 불구하고!)
헨리 치우

77

인쇄 스트림을 인수로 사용하는 Throwable.printStackTrace ()의 대체 형식이 있습니다. http://download.oracle.com/javase/6/docs/api/java/lang/Throwable.html#printStackTrace(java.io.PrintStream)

catch(Exception e) {
    e.printStackTrace(System.out);
}

그러면 std 오류 대신 std에 스택 추적이 인쇄됩니다.


4
@FranklinYu, 질문의 요점은 그가 stderr로 인쇄하지 않고 다른 임의의 스트림으로 인쇄하고 싶지 않다는 것입니다.
Mike Deck

9

Android 개발자 미니멀리스트의 경우 : Log.getStackTraceString(exception)


1
이것을 사용하여 임의의 스트림으로 인쇄 할 수 없습니다. 로거를 구성한 경우에만 유용합니다.
rv

나는이 미니멀 한 접근 방식을 좋아하지만 :( 내 SLF4J과 젤리하지 않았다
흥을 깨는 사람

7

Apache commons는 스택 추적을 throwable에서 문자열로 변환하는 유틸리티를 제공합니다.

용법:

ExceptionUtils.getStackTrace(e)

전체 문서는 https://commons.apache.org/proper/commons-lang/javadocs/api-release/index.html참조하십시오.


이 답변은 매우 정확 해 보이지만 질문에 대한 답변은 아닙니다. OP는 스택 추적을 다른 스트림으로 인쇄하는 방법을 물었습니다.
Buurman

이것이 OP의 질문에 대답하지 않더라도 매우 잘 설정된 형식을 사용하여 예외를 String으로 만드는 가장 좋은 방법이라고 생각합니다. 감사!
Clint Eastwood

7

stackTrace를 얻는 데 도움이되는 메서드를 만들었습니다.

private static String getStackTrace(Exception ex) {
    StringBuffer sb = new StringBuffer(500);
    StackTraceElement[] st = ex.getStackTrace();
    sb.append(ex.getClass().getName() + ": " + ex.getMessage() + "\n");
    for (int i = 0; i < st.length; i++) {
      sb.append("\t at " + st[i].toString() + "\n");
    }
    return sb.toString();
}

3

의 Throwable 클래스라는 두 가지 방법을 제공 printStackTrace하는 하나를 수용 PrintWriter하고 취하는 한 PrintStream지정된 스트림 스택 트레이스를 출력하는 것을. 이들 중 하나를 사용해보십시오.


1

javadoc 참조

out = some stream ...
try
{
}
catch ( Exception cause )
{
      cause . printStrackTrace ( new PrintStream ( out ) ) ;
}

0

다음과 같은 추가 정보 (패키지 세부 정보)가 포함 된보다 간결한 스택 추적에 관심이있는 경우 :

  java.net.SocketTimeoutException:Receive timed out
    at j.n.PlainDatagramSocketImpl.receive0(Native Method)[na:1.8.0_151]
    at j.n.AbstractPlainDatagramSocketImpl.receive(AbstractPlainDatagramSocketImpl.java:143)[^]
    at j.n.DatagramSocket.receive(DatagramSocket.java:812)[^]
    at o.s.n.SntpClient.requestTime(SntpClient.java:213)[classes/]
    at o.s.n.SntpClient$1.call(^:145)[^]
    at ^.call(^:134)[^]
    at o.s.f.SyncRetryExecutor.call(SyncRetryExecutor.java:124)[^]
    at o.s.f.RetryPolicy.call(RetryPolicy.java:105)[^]
    at o.s.f.SyncRetryExecutor.call(SyncRetryExecutor.java:59)[^]
    at o.s.n.SntpClient.requestTimeHA(SntpClient.java:134)[^]
    at ^.requestTimeHA(^:122)[^]
    at o.s.n.SntpClientTest.test2h(SntpClientTest.java:89)[test-classes/]
    at s.r.NativeMethodAccessorImpl.invoke0(Native Method)[na:1.8.0_151]

spf4j lib 에서 Throwables.writeTo 를 사용해 볼 수 있습니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.