마니의 공부방/Java

[java] Exception printStackTrace() 를 문자열로

알고써야할텐데.. Exception printStackTrace()

간혹 개발을 하다보면 Exception이 발생한 곳에서 catch(Exception e) 해서 exception 을 캐치하고 e.printStackTrace()를 통해 로그에 exception 내용을 남기는 경우가 있다.

 

그런데 이놈의 Exception에 printStackTrace()를 하면 여러 exception 발생 순서를 따라가다보니 에러내용이 보고싶은데로 보여지지 않는경우가 발생한다.

 

Exception 로그를 처리할때 방법이 참 여러가지이긴한것 같다. 설계하기 나름이니까~

1. catch 구문에서 log만 찍고 throw 할건지

2. throws 이후에 Framework에서 log를 찍을건지

그런데 후자가 더 낫고, 전자의 경우 로그찍는곳에서 중구난방으로 에러발생가능 여지가 있다.

 

하지만 나는 이런 어디서 로그를 남길건지가 아니고 Exception 내용을 제대로 문자열화하여 출력되기를 원한다.

 

Exception의 주요 함수

e.getMessage() : 에러의 원인을 간단하게 출력합니다.
e.toString() : 에러의 Exception 내용과 원인을 출력합니다.
e.printStackTrace() : 에러의 발생근원지를 찾아서 단계별로 에러를 출력합니다.

 

항상 고민하고, 생각하자! 정답은 없다!

이전 프로젝트를 진행할때 알게된 어떤 개발자분(짱짱)이신분이 설명해주시면서 같이 공통 프레임워크를 만들었던 경험이 있어서 그때 적용한 내용을 공유코자 남깁니다.

공유도 하고, 저는 한번 더 내용을 되새기면서 공부도할겸!

public String getExceptionInfo(Throwable e) {
    StringBuffer sb = new StringBuffer();
    sb.append(e.getClass().getName()).append(": ").append(e.getMessage()).append("\n");
    StackTraceElement[] el = e.getStackTrace();
    for (int i = 0; i < el.length; i++) {
        if (i != 0) sb.append("\n");
        sb.append("        ").append("at ").append(el[i].getClassName() + "." + el[i].getMethodName());
        sb.append("(").append(el[i].getFileName()).append(":").append(el[i].getLineNumber()).append(")");
    }

    Throwable innerE = e.getCause();
    if (innerE != null) {
        sb.append("\nCaused by: ");
        sb.append(getExceptionInfo(innerE));
    }

    return sb.toString();
}