본문 바로가기
Java

에러메세지는 어떤걸 남겨야 할까?

by 오렌지마끼야또 2023. 7. 11.
728x90
반응형

 

 

 

 

 

개발을 하면서 try catch 문으로 Exception을 핸들링할 때 에러 로그를 남기죠!

이때 여러가지 선택지가 있습니다.

e.getClass()

e.getMessage()

e.toString()

e.printStackTrace()

등등

위의 메소드들이 각각 어떤것을 보여주는지 알아보겠습니다.

 

 

 

참고로 logging 라이브러리는 Slf4j 를 사용하였습니다.

@Slf4j

https://orange-makiyato.tistory.com/42

 

Java logging @Slf4j

로깅이란 - 로깅(logging)은 정보를 제공하는 일련의 기록인 로그(log)를 생성하도록 시스템을 작성하는 활동을 말한다. 로그 레벨 - 레벨에 따라서 로그 메세지가 달라진다. - TRACE < DEBUG < INFO < WARN <

orange-makiyato.tistory.com

 

 

 

1. e.getClass()

        try {
            String name = "abcd";
            int num = Integer.parseInt(name);
        }
        catch (Exception e) {
            log.error("에러가 발생하였습니다. {}", e.getClass());
        }

String 을 int 로 변환하려는 간단한 코드를 예로 보겠습니다.

불가능하니 Exception이 발생하겠죠?

출력된 내용을 보면

딱 어떤 Exception 종류인지만 나타냅니다.

 

 

 

2. e.getMessage()

        try {
            String name = "abcd";
            int num = Integer.parseInt(name);
        }
        catch (Exception e) {
            log.error("{}", e.getMessage());
        }

e.getMessage() 는 에러가 난 원인(뭐때문에?) 만 출력해줍니다.

 

 

 

3. e.toString()

e.toString() 은 앞에서 본 e.getClass() 와 e.getMessage() 를 모두 보여줍니다.

간단하게 에러에 대한 내용을 보여주는 것이죠.

        try {
            String name = "abcd";
            int num = Integer.parseInt(name);
        }
        catch (Exception e) {
            log.error("{} : {}", e.getClass(), e.getMessage());
            log.error("{}", e.toString());
        }

내용이 동일한 것을 알 수 있습니다.

 

 

 

4. e.printStackTrace()

        try {
            String name = "abcd";
            int num = Integer.parseInt(name);
        }
        catch (Exception e) {
            e.printStackTrace();
        }

e.printStackTrace() 는 e.getClass(), e.getMessage()에 추가로 어떤 흐름을 통해 에러가 났고 근원지가 어디인지까지 자세하게 보여줍니다. 가장 유용하게 볼 수 있겠죠?

 

 

미세 팁이긴 합니다만 혹시 바로 위의 e.printStackTrace() 코드에서 다른점을 발견하셨나요?

바로 Slf4j 를 사용한 log.error({}, e.printStackTrace()); 으로 작성하지 않았다는 겁니다!

실제로 이렇게 쓰면 빨간줄이 뜹니다.

왜냐하면 e.printStackTrace()는 Exception 정보를 바로 콘솔에 출력하고 void를 반환하기 때문입니다.

 

따라서 log.error("", e.printStackTrace());는 e.printStackTrace()의 반환값을 log.error()의 메세지로 전달하려고 하기 때문에 컴파일러가 이를 잘못된 사용으로 간주하여 빨간 줄을 표시합니다.

 

그래서 e.printStackTrace() 내용을 Slf4j 를 사용해서 출력하는 방법은 e 를 그대로 사용하는 것입니다.

        try {
            String name = "abcd";
            int num = Integer.parseInt(name);
        }
        catch (Exception e) {
            log.error("에러가 발생하였습니다.", e);
        }

저처럼 '에러가 발생하였습니다.' 와 같은 특정 메세지도 출력하고 싶다면 위와같이 사용하면 되고, 그냥 Exception 객체의 스택 트레이스만 있어도 된다면 e.printStackTrace() 만 쓰시면 됩니다.

 

 

로그 내용은 모두 따로 수집하게 되는데요. 간혹 프로젝트 중에 모든 에러 내용을 다 출력하면 용량이 너무 많아진다고 필요한 것만 남기자고 할 수도 있습니다. 그건 프로젝트에 따라 맞춰서 하시면 되겠습니다. 제한을 주지 않는다면 e.printStackTrace() 를 사용하는게 가장 좋겠죠?

 

728x90
반응형

'Java' 카테고리의 다른 글

자바 저장 글  (0) 2024.07.09
HashMap이 저장되는 형태와 원리, heap, stack 메모리구조  (0) 2024.06.10
Java Date 날짜, 시간 패턴 바꾸기  (0) 2022.08.12
VO, DTO, Entity  (0) 2022.08.03
Java Optional  (0) 2022.07.29

댓글