공부/JAVA

자바 Exception printStackTrace를 String 객체에 담기

JangGiraffe 2019. 8. 1. 21:24

안녕하세요 장지랩입니다.

자바 프로그램을 만들다 보면 예상치 못한 오류가

발생하는데요, 그런 예외 처리를 위해 저희는 try-catch문이나 throw 또는 예외를 관리하는 메서드를 커스템해서 만들기도 합니다.

만약 에러가 발생하면 에러의 원인을 찾기 위해 익셉션 트레이스를 이용하는데요,

예시를 볼까요?

	try {			
			String b = "Text";
			
			Integer.parseInt(b);
			
		}catch(Exception e) {
			e.printStackTrace();
		}

String형 변수 b를 선언하고 Text라는 값을 해당 변수에 대입해줍니다.

그 후 Integer.parseInt()메서드를 사용해 String 변수 b를 int형으로 형변환 시켜줍니다.

이 때 에러가 발생합니다. 이걸 Exception의 printStackTrace 메서드를 이용해 콘솔에 찍어보면 ..

NumberFormatException 발생

Text라는 문자열을 정수형 변수인 int형으로 바꾸려고 해서 NumberFormatException이 발생했습니다.

stackTrace를 따라가면 오류의 원인을 쉽게 파악할 수 있는데요, 이걸 메인에서만 사용한다면 크게 문제는 없습니다.

다만 해당 StackTrace를 로그로 기록하고 싶다면 얘기가 달라지는데, Exception이 가지고있는 메서드중 String을 반환해 주는 메서드를 살펴보겠습니다.

Exception 클래스가 가지고 있는 여러 메서드들

로그는 보통 문자열을 이용해 찍게 되는데, 에러로그를 찍기 위해서는 에러를 String으로 반환해주는 메서드가 필요할 것 같습니다. 각각 사용해보겠습니다.

		try {
			
			String b = "Text";
			
			Integer.parseInt(b);
			
		}catch(Exception e) {
			System.out.println("e.getLocalizedMessage() : " + e.getLocalizedMessage());
			System.out.println("e.getMessage() : " + e.getMessage());
			System.out.println("e.toString() : " + e.toString());
		}

결과는 이렇습니다.

굉장히 부실하고 열악한 로그입니다. 이 로그만 봐서는 어느라인에서 어떤 익셉션이 발생했는지를 파악하기가 힘들 수 있습니다.

그럼 stackTrace를 String으로 바꾸는 방법에 대해 알아볼까요?

stackTrace -> toString!

방법은 간단합니다.

매개변수로 PrintStream을 가지고 있는 printStackTrace를 이용하면 됩니다.

		try {
			
			String b = "Text";
			
			Integer.parseInt(b);
			
		}catch(Exception e) {
			ByteArrayOutputStream out = new ByteArrayOutputStream();
			PrintStream printStream = new PrintStream(out);
			e.printStackTrace(printStream);
			String traceStr = out.toString();
			
			System.out.println(traceStr);
			
		}
java.lang.NumberFormatException: For input string: "Text"
	at java.base/java.lang.NumberFormatException.forInputString(Unknown Source)
	at java.base/java.lang.Integer.parseInt(Unknown Source)
	at java.base/java.lang.Integer.parseInt(Unknown Source)
	at code1.main(code1.java:12)

PrintStream을 이용해 결과값으로 에러내용을 스트링형으로 얻어올 수 있었습니다.

 

만든 기능을 재사용하기 위해 메서드로 빼주면 두고두고 쓸 수 있습니다 ^o^

public static void main(String[] args) { // main mathod 라고 부르면 됨.
		
		try {
			
			String b = "Text";
			
			Integer.parseInt(b);
			
		}catch(Exception e) {
			System.out.println(TraceError(e));
			
		}
	}
	
	static String TraceError(Exception e) {
		ByteArrayOutputStream out = new ByteArrayOutputStream();
		PrintStream printStream = new PrintStream(out);
		e.printStackTrace(printStream);
		
		return out.toString();
	}

이상입니다 - 

혹시 아쉬운 부분이 있다면 댓글로 코칭 부탁드립니다 ~!!

또 궁금한점을 댓글로 물어봐주시면 저도 공부해서 답변을 달도록 하겠습니다 ㅎㅎ!!

반응형