티스토리 뷰

Java에서 Exception 과 Error 는 Throwable 이 상속되어있다.

일반적으로 예외처리를 하고 디버깅을 위해 e.printStackTrace() 를 넣어놓는데 System 로그로 알아서 찍힌다.

이것을 문자열로 받아서 다르게 처리 할 수는 없을까.?


Java에서 아래의 구문으로 Throwable 에 들어있는 Stack Trace 를 가져올 수 있다.

이는 e.printStackTrace() 할 때의 문자열가 거의 동일하다.


 StringWriter sw = new StringWriter();

PrintWriter pw = new PrintWriter(sw);

throwable.printStackTrace(pw);

String textStackTrace = sw.toString();


히지만 거의 동일 할 뿐 정확히 같지는 않다. 

e.printStackTrace() 와 위 코드를 실행해보면 딱 하나 마지막 실행코드의 line이 다르다.


마지막 실행코드에 위실행 코드는 코드가 요청된 마지막 line이 찍히지만

e.printStackTrace() 는 코드가 요청된 마지막 오류Throwable line 이 찍히게 된다.


뭔말이냐면..

(Check)에서 e.printStackTrace()를 하면 tc.run() 의 line 이 찍히지만

위코드를 적용하면 위코드가 실행된 (Check)의 line 이 찍힌다.


try {

 TestCode tc = null;

 tc.run();

} catch (Exception e) {

 (Check) 

} 


한마디로 디버깅용도로 활용하기가 적절하지 않다.


안드로이드에서는 아래와 같이 StackTrace 를 String 으로 반환 받을 수 있는 기능을 제공한다.



Log.getStackTraceString(throwable) 


이렇게 하면되면 e.printStackTrace() 와 완전히 동일한 문자열 추출이 가능하다.


이런기능을 활용하여 어플의 Log를 추출하여 오류리포트를 제공받아 다양한 사용자환경에서의 디버깅을 할 수 있겠다.


[작성자] devbible.tistory.com


댓글