본문 바로가기
배움 조각 (Computer Science)

Exception 사용 팁: 효과적으로 예외를 다루는 방법

by 러너콜리 2024. 11. 19.

 

개발자 온보딩 가이드의 "4장: 운영 환경을 고려한 코드 작성"에 Exception 사용 방법이 잘 정리되어 있다. 이 책의 내용과 ChatGPT를 활용하여, Exception 사용 팁을 정리해봤다.

 

 

1. Exception 이름은 구체적으로 네이밍하자.

  • 구체적인 이름은 Exception이 발생한 원인을 빠르게 이해하고, 문제를 해결하는 데 도움을 준다.
  • Good Example: InvalidOrderException, UserNotFoundException

 

2. Exception에 추가 정보를 활용하자.

  • Exception 생성자에 메시지를 포함하거나, 필요한 경우 커스텀 필드를 추가하여 유용한 정보를 제공하.
public class InvalidOrderException extends RuntimeException {
    public InvalidOrderException(String message, int orderId) {
        super(String.format("%s (Order ID: %d)", message, orderId));
    }
}

 

3. Exception은 가장 이른 시점에 던지고, 최대한 나중에 처리하자

  • 예외를 가능한 한 문제가 발생한 위치에서 던지면 스택 트레이스와 컨텍스트를 유지할 수 있습다.
  • 처리하는 로직은 상위 레벨(Controller, Handler 등)에서 수행하여 코드의 가독성과 유지보수성을 높이는 것이 이상적이다.
public void validateOrder(Order order) {
    if (order == null) {
        throw new InvalidOrderException("Order cannot be null", -1);
    }
}

try {
    validateOrder(order);
    processOrder(order);
} catch (InvalidOrderException e) {
    log.error("Order processing failed: {}", e.getMessage());
    return ResponseEntity.badRequest().body("Invalid order.");
}

 

4. 비즈니스 로직 용도로 Exception을 사용하지 말자

  • 단순히 조건문으로 처리할 수 있는 로직을 Exception으로 처리하는 것은 좋지 않다.
try {
    if (userAge < 18) {
        throw new IllegalArgumentException("User must be 18 or older.");
    }
} catch (IllegalArgumentException e) {
    return "Access denied.";
}

 

5. 예외를 삼키지 말자

  • Exception을 처리할 때 가장 나쁜 습관은 아무 행동도 하지 않고 삼키는 것이다.
try {
    doSomething();
} catch (Exception e) {
    // 아무것도 하지 않음
}