스택 추적을 문자열로 변환하려면 어떻게해야합니까?


1502

Throwable.getStackTrace()스택 트레이스를 나타내는 문자열로 결과를 변환하는 가장 쉬운 방법은 무엇입니까 ?


6
jqno의 답변은 실제로 질문에 지정한 Throwable.getStackTrace () 메소드를 사용하지만 Brian은 그렇지 않습니다. 대신 Throwable.printStackTrace ()를 사용합니다.
Stijn de Witt

10
거의 모든 Java 프로젝트에는 Apache commons-lang이 포함되어야합니다. 여기에는 매우 일반적인 개발 요구를 구현하는 많은 편리한 방법이 포함됩니다.
Russell Silva

20
@StijndeWitt이 세 줄의 코드는 사용자가 호출 한 장소를 제외하고 거의 확실하게 팩토링해야합니다. 어디에 두어야할지 모르기 때문에 다른 유용한 스 니펫과 함께 유틸리티 도구 상자에 들어갑니다. 빙고! 방금 구아바 / commons-lang / 무엇이든 재개발했습니다. 합리적인 유틸리티 라이브러리를 대신 가져 와서 휠 재창조를 저장하십시오. 초보자의 진정한 표시는 도서관 작가보다 더 나은 일을 할 수 있다고 생각한다는 것입니다.
Andrew Spencer

6
1. 구아바에는 Throwables.getStackTraceAsString (e)이 있습니다. 2. Apache Commons Lang-ExceptionUtils.getFullStackTrace 3. 자체 사용자 정의 메소드 작성
user2323036

8
@ AndrewSpencer 나는 당신이 왜 작은 조각으로 이것을 달성하기 위해 StijndeWitt를 강타하려고 열심히 노력하는지 이해하지 못합니다. 작은 유틸리티 메소드를 작성하는 데 실제로 큰 위험은 없습니다 ( "SHEER ARROGANCE oh nooooo !! 그는 아파치보다 낫다고 생각합니다!"). 특히 Java 이외의 JVM 언어에는 스택 추적을 기록하기 위해 Guava 또는 Commons Lang을 포함시키지 않으려는 수많은 프로젝트가 있습니다. 나는 Scala & Clojure 라이브러리를 작성하고 확실히 Apache Commons Lang을 하나의 메소드에 대한 전 이적 종속성으로 만들지 않을 것입니다.
jm0

답변:


1039

다음 방법을 사용하여 Exception스택 추적을 로 변환 할 수 있습니다 String. 이 클래스는 많이 사용되는 오픈 소스가있는 가장 일반적인 종속 라이브러리 인 Apache commons-lang으로 제공됩니다.

org.apache.commons.lang.exception.ExceptionUtils.getStackTrace(Throwable)


88
@Stijn-공정하게 (아래에 현재 가장 높은 투표 답변을 썼습니다) 훨씬 더 많은 기능을 위해 commons-lang을 살펴볼 가치가 있습니다.
Brian Agnew

54
@StijndeWitt Commons Lang은 꽤 일반적입니다. 직장 내 대부분의 프로젝트 / 프로젝트에 이미 존재합니다.
WhyNotHugo

16
@Hugo 덕분에 StringWriter를 사용하여 새 라이브러리를 추가하지 않아도되었습니다. 이는 이미 3 개의 종속성 중 하나 인 것으로 나타났습니다. 나머지는 이미 가지고 있는지 확인하십시오.
Nathanial

33
@MartinAsenov-당신의 논리에 따라 그런 라이브러리를 사용하지 않을 것입니까? 이미 사용하지 않으면 사용하지 않습니까?
Brian Agnew

16
참고로, 패키지가 변경되었으며 클래스는 다음 위치에 org.apache.commons.lang3.exception.ExceptionUtils있습니다.
schmmd

2201

Throwable.printStackTrace(PrintWriter pw)스택 추적을 적절한 기록기에 보내려면 사용하십시오 .

import java.io.StringWriter;
import java.io.PrintWriter;

// ...

StringWriter sw = new StringWriter();
PrintWriter pw = new PrintWriter(sw);
e.printStackTrace(pw);
String sStackTrace = sw.toString(); // stack trace as a string
System.out.println(sStackTrace);

505
이처럼 작고 간단한 것을 위해 외부 라이브러리를 포함하고 싶지 않다면이 대답을 사용하십시오.
Stijn de Witt

8
이것은 printStackTrace ()와 같은 방식으로 스택 추적을 다듬습니다. 스택의 모든 예외가 표시되지만 각 예외에 대해 스택이 잘릴 수 있습니다. 전체 추적이 필요한 사람은 이것을 고려해야합니다.
Laila Agaev

5
이것은 아파치의 ExceptionUtils.getStackTrace () 메소드가하는 것과 거의 똑같습니다. 실제로 편지에 거의.
ticktock

6
@BrianAgnew, StringWriterand 를 닫지 않아야 PrintWriter합니까?
무하마드 Gelbana

13
@BrianAgnew, 답변 주셔서 감사합니다. 그것은 나를 호기심을 가지고 여기 내가 찾은 것입니다 : stackoverflow.com/questions/14542535/...
무하마드 Gelbana에게

459

이것은 작동해야합니다 :

StringWriter sw = new StringWriter();
e.printStackTrace(new PrintWriter(sw));
String exceptionAsString = sw.toString();

69
Java 컨텍스트의 간결한 내용은 항상 산만합니다. 그것은 printStackTrace문자열을 반환하고 사용자에게 인쇄할지 여부를 결정합니다 :)
dmitry

35
콘솔에서 printStackTrace 인쇄는 허용되지만 최소한 문자열로 반환하는 getStackTrace는 기본적으로 사용 가능해야합니다.
Mateus Viccari

5
이것의 어떤 부분이 간결합니까? 스택 추적을 문자열에 넣는 것 외에는 다른 목적으로 존재하는 2 개의 객체를 구성해야합니다.
ArtOfWarfare

7
@dmitry 호출 된 메소드는 printXXX()XXX를 인쇄해야합니다.
user207421

2
@Greg 사실 그것은 냉소적이지도 않았지만, 그가 말한 것을 읽기만하면됩니다.
Andrew

224

Android 용으로 개발하는 경우 훨씬 쉬운 방법은 다음을 사용하는 것입니다.

import android.util.Log;

String stackTrace = Log.getStackTraceString(exception); 

형식은 getStacktrace와 동일합니다. 예를 들어

09-24 16:09:07.042: I/System.out(4844): java.lang.NullPointerException
09-24 16:09:07.042: I/System.out(4844):   at com.temp.ttscancel.MainActivity.onCreate(MainActivity.java:43)
09-24 16:09:07.042: I/System.out(4844):   at android.app.Activity.performCreate(Activity.java:5248)
09-24 16:09:07.043: I/System.out(4844):   at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1110)
09-24 16:09:07.043: I/System.out(4844):   at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2162)
09-24 16:09:07.043: I/System.out(4844):   at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2257)
09-24 16:09:07.043: I/System.out(4844):   at android.app.ActivityThread.access$800(ActivityThread.java:139)
09-24 16:09:07.043: I/System.out(4844):   at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1210)
09-24 16:09:07.043: I/System.out(4844):   at android.os.Handler.dispatchMessage(Handler.java:102)
09-24 16:09:07.043: I/System.out(4844):   at android.os.Looper.loop(Looper.java:136)
09-24 16:09:07.044: I/System.out(4844):   at android.app.ActivityThread.main(ActivityThread.java:5097)
09-24 16:09:07.044: I/System.out(4844):   at java.lang.reflect.Method.invokeNative(Native Method)
09-24 16:09:07.044: I/System.out(4844):   at java.lang.reflect.Method.invoke(Method.java:515)
09-24 16:09:07.044: I/System.out(4844):   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
09-24 16:09:07.044: I/System.out(4844):   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)

2
감사. 이 경우 printStackTrace ()와 같이 날짜와 태그가 모든 행에 기록되지는 않습니다.
CoolMind

1
실제로 코어의 Log.getStackTraceString은 위에서 언급 한 (D. Wroblewski의) StringWriter 및 Printwriter를 사용합니다.
MikeL

2
안드로이드 로그에 인쇄하는 가장 쉬운 방법은 다음과 같습니다. Log.e("TAG", "My message", new Throwable());
Erick M. Sprengel


113

경고 : 원인을 포함하지 않습니다 (일반적으로 유용한 비트입니다).

public String stackTraceToString(Throwable e) {
    StringBuilder sb = new StringBuilder();
    for (StackTraceElement element : e.getStackTrace()) {
        sb.append(element.toString());
        sb.append("\n");
    }
    return sb.toString();
}

1
당신은 예를 들어, 추적 트림 매개 변수 maxLines을 통과 만 추적에 많은 라인을 추가 할 경우, 나는이 방법의 확장과 함께 가고 싶어
리치 판매자를

e.getStackTrace 뒤의 괄호가 없습니다. 공개 정적 문자열 stackTraceToString (예외 e) {StringBuilder sb = new StringBuilder (); for (StackTraceElement 요소 : e.getStackTrace ()) {sb.append (element.toString ()); sb.append ( "<br />"); } return sb.toString (); }
rlc

2
확실하지 않지만 근본 원인 예외의 스택 추적을 인쇄하지 않을 것이라고 생각합니다.
apoorv020

7
무엇을하든 추적을 자르지 마십시오. 유용한 부품이 제거 된 GlassFish 로그의 스택 추적을 여러 번보고 나에게 여러 번 발생했습니다.
cayhorstmann

DOS 라머를 행복하게하려면 String.format("%n")대신 또는 비슷한 것을 사용하십시오 "\n".
ceving

89

나를 위해 가장 깨끗하고 쉬운 방법은 다음과 같습니다.

import java.util.Arrays;
Arrays.toString(e.getStackTrace());

37
코드는 깨끗하지만 출력은 깨끗하지 않습니다. 마지막에 .replaceAll ( ",", "\ n")을 수행해야합니다. 그러나 printStackTrace가 제안한 들여 쓰기가 손실됩니다.
fury

4
이것은 한 줄에 추적을 기록 할 때 유용합니다
webjockey

28
public static String getStackTrace(Throwable t) {
    StringWriter sw = new StringWriter();
    t.printStackTrace(new PrintWriter(sw));
    return sw.toString();
}

1
안녕하세요, 인용 된 답변의 의견 섹션에 객체 StringWriterPrintWriter객체가 closed PrintWriter이어야한다고 지적하고 StringWriter싶습니다.
Eric

8
영감을 받아 복사를 의미합니까? 당신은이다 "성촉 절"보는 것처럼 여기에 답변을 읽기 ... 방법에 넣어
Murmel

26

다음 코드를 사용하면 Stringlog4J 또는 심지어 API를 사용하지 않고도 전체 stackTrace를 형식 으로 가져올 수 있습니다 java.util.Logger.

catch (Exception e) {
    StackTraceElement[] stack = e.getStackTrace();
    String exception = "";
    for (StackTraceElement s : stack) {
        exception = exception + s.toString() + "\n\t\t";
    }
    System.out.println(exception);
    // then you can send the exception string to a external file.
}

1
나중에하지만 조금 부피가 커 보이지 않습니까? 합리적인 크기의 프로젝트 로깅 프레임 워크에 귀찮게 왜 그렇게 필수입니다
mzzzzb

이것은 처음에 오류 메시지를 제공하지 않습니다. 그래도 추가 가능
kommradHomer

간단한 연결 대신 StringBuffer를 사용할 수 있습니다.
dedda1994

개인 정보 보호를 위해 메시지를 기록 할 수없는 경우에 유용합니다.
A1m

이 솔루션은 내부 원인을 기록하지 않습니다
A1m

19

다음은 코드에 직접 복사하여 붙여 넣을 수있는 버전입니다.

import java.io.StringWriter; 
import java.io.PrintWriter;

//Two lines of code to get the exception into a StringWriter
StringWriter sw = new StringWriter();
new Throwable().printStackTrace(new PrintWriter(sw));

//And to actually print it
logger.info("Current stack trace is:\n" + sw.toString());

또는 캐치 블록에서

} catch (Throwable t) {
    StringWriter sw = new StringWriter();
    t.printStackTrace(new PrintWriter(sw));
    logger.info("Current stack trace is:\n" + sw.toString());
}

이것은 현재 기능의 범위를 넘어 계속 될 것 입니다. Throwable정의 된 곳이 맞습니까?
n611x007

16
Arrays.toString(thrown.getStackTrace())

결과를 문자열로 변환하는 가장 쉬운 방법입니까? 프로그램에서 이것을 사용하여 스택 추적을 인쇄합니다.

LOGGER.log(Level.SEVERE, "Query Builder Issue Stack Trace : {0} ,Message : {1} objid {2}", new Object[]{Arrays.toString(e.getStackTrace()), e.getMessage(),objId});

나를 위해 일했는데 아무것도 손질되지 않는 것 같습니다! 외부 라이브러리가없는 다른 답변보다 간단합니다.
Shaung Cheng

16

스택 추적을 인쇄하여 PrintStream다음으로 변환하십시오 String.

// ...

catch (Exception e)
{
    ByteArrayOutputStream out = new ByteArrayOutputStream(); 
    e.printStackTrace(new PrintStream(out));
    String str = new String(out.toByteArray());

    System.out.println(str);
}

1
이것은 가장 직접적인 답변입니다
DaSqy Stc

11

문자열로 스택 추적 인쇄

import java.io.PrintWriter;
import java.io.StringWriter;

public class StackTraceUtils {
    public static String stackTraceToString(StackTraceElement[] stackTrace) {
        StringWriter sw = new StringWriter();
        printStackTrace(stackTrace, new PrintWriter(sw));
        return sw.toString();
    }
    public static void printStackTrace(StackTraceElement[] stackTrace, PrintWriter pw) {
        for(StackTraceElement stackTraceEl : stackTrace) {
            pw.println(stackTraceEl);
        }
    }
}

인스턴스를 만들지 않고 현재 스레드 스택 추적을 인쇄하려고 할 때 유용 Throwable하지만 새 Throwable스택 을 만들고 스택 추적을 얻는 것이 실제로 호출하는 것보다 빠르고 저렴하다는 점에 유의하십시오 Thread.getStackTrace.


11

코 틀린

Throwable 클래스를 확장하면 String 속성이 제공됩니다 error.stackTraceString.

val Throwable.stackTraceString: String
  get() {
    val sw = StringWriter()
    val pw = PrintWriter(sw)
    this.printStackTrace(pw)
    return sw.toString()
  }

10
private String getCurrentStackTraceString() {
    StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();
    return Arrays.stream(stackTrace).map(StackTraceElement::toString)
            .collect(Collectors.joining("\n"));
}

1
감사합니다 eddyrkokr! 그것은 내 모든 걸음에 완벽하게 작동합니다. 방금 기본 TestNG 클래스에 추가했으며 모든 테스트에서 하나씩 스택 추적을 수집합니다!
Krzysztof Walczewski

9

첫 번째 주석 세트의 영리한 저격은 매우 재미 있었지만 실제로는하려는 일에 달려 있습니다. 올바른 라이브러리가 없다면 (D. Wroblewski의 답변에서와 같이) 3 줄의 코드가 완벽합니다. OTOH, apache.commons 라이브러리가 이미 있다면 (대부분의 큰 프로젝트처럼) Amar의 대답은 더 짧습니다. 라이브러리를 가져 와서 올바르게 설치하는 데 10 분이 걸릴 수 있습니다 (무엇을하고 있는지 아는 경우 1 개 미만). 그러나 시계가 똑딱 거리므로 여유 시간이 없을 수 있습니다. Jarek Przygódzki는 흥미로운 중첩을 가지고있었습니다.

그러나 전체 스택 추적, 중첩 및 전체 필요한 경우 어떻게 해야합니까? 이 경우 비밀은 apache.common의 getFullStackTrace를 사용하는 것입니다 ( http://commons.apache.org/proper/commons-lang/javadocs/api-2.6/org/apache/commons/lang/exception/ExceptionUtils.html 참조) # getFullStackTrace % 28java.lang.Throwable % 29 )

베이컨을 구했습니다. 힌트를 주셔서 감사합니다.


9

Apache Commons Lang 3.4 ( JavaDoc )의 코드 :

public static String getStackTrace(final Throwable throwable) {
    final StringWriter sw = new StringWriter();
    final PrintWriter pw = new PrintWriter(sw, true);
    throwable.printStackTrace(pw);
    return sw.getBuffer().toString();
}

다른 답변에 차이가 있다는 점이다 이 사용하는 autoFlushPrintWriter.


8

java.io.*그것 없이는 이렇게 할 수 있습니다.

String trace = e.toString() + "\n";                     

for (StackTraceElement e1 : e.getStackTrace()) {
    trace += "\t at " + e1.toString() + "\n";
}   

그리고 trace변수는 스택 추적을 유지합니다. 출력은 또한 초기 원인을 보유하며 출력은printStackTrace()

예를 들면 다음과 printStackTrace()같습니다.

java.io.FileNotFoundException: / (Is a directory)
    at java.io.FileOutputStream.open0(Native Method)
    at java.io.FileOutputStream.open(FileOutputStream.java:270)
    at java.io.FileOutputStream.<init>(FileOutputStream.java:213)
    at java.io.FileOutputStream.<init>(FileOutputStream.java:101)
    at Test.main(Test.java:9)

trace에 인쇄 할 때 문자열 보유stdout

java.io.FileNotFoundException: / (Is a directory)
     at java.io.FileOutputStream.open0(Native Method)
     at java.io.FileOutputStream.open(FileOutputStream.java:270)
     at java.io.FileOutputStream.<init>(FileOutputStream.java:213)
     at java.io.FileOutputStream.<init>(FileOutputStream.java:101)
     at Test.main(Test.java:9)

5

스칼라 버전

def stackTraceToString(e: Exception): String = {
  import java.io.PrintWriter
  val sw = new StringWriter()
  e.printStackTrace(new PrintWriter(sw))
  sw.toString
}

5

Java 8을 사용하는 경우 이것을 시도하십시오

Arrays.stream(e.getStackTrace())
                .map(s->s.toString())
                .collect(Collectors.joining("\n"));

다음 과 같이 getStackTrace()제공되는 기능 코드를 찾을 수 있습니다 Throwable.java.

public StackTraceElement[] getStackTrace() {
    return getOurStackTrace().clone();
}

그리고이를 위해 다음 StackTraceElement과 같이 제공 toString()됩니다.

public String toString() {
    return getClassName() + "." + methodName +
        (isNativeMethod() ? "(Native Method)" :
         (fileName != null && lineNumber >= 0 ?
          "(" + fileName + ":" + lineNumber + ")" :
          (fileName != null ?  "("+fileName+")" : "(Unknown Source)")));
}

StackTraceElement"\ n"과 함께 가입하십시오 .


이 솔루션은 스택 추적 탭 들여 쓰기를 존중하지 않습니다. 그렇지 않으면 훌륭하게 작동합니다!
krizajb

4

Gala의 답변에 대한 확장은 예외의 원인도 포함합니다.

private String extrapolateStackTrace(Exception ex) {
    Throwable e = ex;
    String trace = e.toString() + "\n";
    for (StackTraceElement e1 : e.getStackTrace()) {
        trace += "\t at " + e1.toString() + "\n";
    }
    while (e.getCause() != null) {
        e = e.getCause();
        trace += "Cause by: " + e.toString() + "\n";
        for (StackTraceElement e1 : e.getStackTrace()) {
            trace += "\t at " + e1.toString() + "\n";
        }
    }
    return trace;
}

4

해결 방법은 배열의 stackTrace를 문자열 데이터 유형 으로 변환하는 것 입니다. 다음 예를 참조하십시오.

import java.util.Arrays;

try{

}catch(Exception ex){
    String stack = Arrays.toString(ex.getStackTrace());
    System.out.println("stack "+ stack);
}

4

Java 8 Stream API사용 하면 다음과 같은 작업을 수행 할 수 있습니다.

Stream
    .of(throwable.getStackTrace())
    .map(StackTraceElement::toString)
    .collect(Collectors.joining("\n"));

스택 추적 요소의 배열을 가져 와서 문자열로 변환하고 여러 줄 문자열로 결합합니다.


2
이 솔루션은 메시지를 제거하고 모든 상위 추적을 무시
judovana

3

스택 추적을 동봉 된 여러 줄 문자열로 변환하는 oneliner :

Stream.of(e.getStackTrace()).map((a) -> a.toString()).collect(Collectors.joining("\n", "[", "]"))

"있는 그대로"로거에 전달하기 쉽습니다.


printStackTrace()다음 과 다른 것을 얻습니다. 여기 에서 느슨하게 할 것입니다. 1) 예외가 발생했습니다. 2) 원인과 스택
추적

변환은 printStackTrace()문제의 일부가 아니 었기 때문에 그 차이는 꽤 예상 됩니다.
Andrey Lebedenko

2

외부 라이브러리를 사용하지 않고 Android 용으로 개발하지 않는 경우 다음 과 같이 '확장'방법을 만들 수 있습니다 .

public static String getStackTraceString(Throwable e) {
    return getStackTraceString(e, "");
}

private static String getStackTraceString(Throwable e, String indent) {
    StringBuilder sb = new StringBuilder();
    sb.append(e.toString());
    sb.append("\n");

    StackTraceElement[] stack = e.getStackTrace();
    if (stack != null) {
        for (StackTraceElement stackTraceElement : stack) {
            sb.append(indent);
            sb.append("\tat ");
            sb.append(stackTraceElement.toString());
            sb.append("\n");
        }
    }

    Throwable[] suppressedExceptions = e.getSuppressed();
    // Print suppressed exceptions indented one level deeper.
    if (suppressedExceptions != null) {
        for (Throwable throwable : suppressedExceptions) {
            sb.append(indent);
            sb.append("\tSuppressed: ");
            sb.append(getStackTraceString(throwable, indent + "\t"));
        }
    }

    Throwable cause = e.getCause();
    if (cause != null) {
        sb.append(indent);
        sb.append("Caused by: ");
        sb.append(getStackTraceString(cause, indent));
    }

    return sb.toString();
}

2

오래된 질문이지만 모든 스택을 인쇄하고 싶지 않은 특별한 경우를 추가하고 싶습니다. 특정 클래스 또는 패키지를 제외하고 실제로 관심이없는 부분을 제거하여 .

PrintWriter사용하는 대신 SelectivePrintWriter:

// This filters out this package and up.
String packageNameToFilter = "org.springframework";

StringWriter sw = new StringWriter();
PrintWriter pw = new SelectivePrintWriter(sw, packageNameToFilter);
e.printStackTrace(pw);
String sStackTrace = sw.toString(); 
System.out.println(sStackTrace);

를 Where SelectivePrintWriter클래스는 다음과 같이 주어진다 :

public class SelectivePrintWriter extends PrintWriter {
    private boolean on = true;
    private static final String AT = "\tat";
    private String internal;

    public SelectivePrintWriter(Writer out, String packageOrClassName) {
        super(out);
        internal = "\tat " + packageOrClassName;
    }

    public void println(Object obj) {
        if (obj instanceof String) {
            String txt = (String) obj;
            if (!txt.startsWith(AT)) on = true;
            else if (txt.startsWith(internal)) on = false;
            if (on) super.println(txt);
        } else {
            super.println(obj);
        }
    }
}

이 클래스는 Regex contains또는 다른 기준에 따라 쉽게 필터링 할 수 있습니다 . 또한 Throwable구현 세부 사항에 따라 다릅니다 (변경되지는 않지만 여전히).


1
예, 이것은 잘 작동하며 실제로 매우 유용한 아이디어입니다.
gil.fernandes

2
 import java.io.PrintWriter;
import java.io.StringWriter;

public class PrintStackTrace {

    public static void main(String[] args) {

        try {
            int division = 0 / 0;
        } catch (ArithmeticException e) {
            StringWriter sw = new StringWriter();
            e.printStackTrace(new PrintWriter(sw));
            String exceptionAsString = sw.toString();
            System.out.println(exceptionAsString);
        }
    }
}

프로그램을 실행하면 비슷한 결과가 나타납니다.

java.lang.ArithmeticException: / by zero
at PrintStackTrace.main(PrintStackTrace.java:9)

1

왜 아무도 언급하지 않았는지 궁금합니다 ExceptionUtils.getStackFrames(exception)

나를 위해 스택 추적을 모든 원인으로 끝까지 덤프하는 가장 편리한 방법입니다.

String.join("\n", ExceptionUtils.getStackFrames(exception));

0

경고 : 이것은 약간 벗어난 주제 일 수 있지만 오 잘 ...;)

원래의 포스터 이유 가 스택 추적을 문자열로 문자열로 원했던 이유를 모르겠습니다 . 스택 추적이 SLF4J / Logback LOG로 끝나야하지만 예외가 발생하지 않아야하는 경우 여기에 내가하는 일이 있습니다.

public void remove(List<String> ids) {
    if(ids == null || ids.isEmpty()) {
        LOG.warn(
            "An empty list (or null) was passed to {}.remove(List). " +
            "Clearly, this call is unneccessary, the caller should " + 
            "avoid making it. A stacktrace follows.", 
            getClass().getName(),
            new Throwable ("Stacktrace")
        );

        return;
    }

    // actual work, remove stuff
}

외부 라이브러리가 필요하지 않기 때문에 좋아합니다 (물론 대부분의 장소에 기록되는 로깅 백엔드 제외).


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