TECH/웹개발

[Java] 자바 예외 처리(Exception) 총정리: try-catch부터 Custom Exception까지

런코리치 2026. 2. 11. 08:00

[Java] 예외 처리(Exception Handling) 완벽 가이드: 기초부터 실무 전략까지

프로그램을 만들다 보면 예상치 못한 상황을 마주하게 됩니다. 사용자가 숫자를 넣어야 할 곳에 문자를 넣거나, 네트워크가 갑자기 끊기는 식이죠. 자바는 이러한 '예외적인 상황'을 객체로 관리합니다. 오늘 이 포스팅 하나로 자바 예외 처리를 정복해 보겠습니다.


1. 예외(Exception)와 에러(Error)의 차이

가장 먼저 구분해야 할 것은 에러예외입니다.

  • 에러(Error): JVM 레벨에서 발생하는 심각한 문제입니다. (예: OutOfMemoryError, StackOverflowError). 개발자가 코드로 수습할 수 없는 수준을 말합니다.
  • 예외(Exception): 개발자가 짠 코드나 외부 환경에 의해 발생하며, 코드로 수습이 가능한 상황입니다.

2. 예외의 두 얼굴: Checked vs Unchecked

자바 예외는 크게 두 가지로 나뉩니다. 이 차이를 아는 것이 실무의 시작입니다.

구분 Checked Exception Unchecked Exception
대표 클래스 IOException, SQLException RuntimeException 상속 클래스들
처리 여부 반드시 예외 처리를 해야 함 (컴파일 에러) 예외 처리를 강제하지 않음
확인 시점 컴파일 단계 실행 단계 (Runtime)

실무 팁: 최근 트렌드는 예외 처리를 강제하는 Checked Exception보다, 로직의 흐름을 방해하지 않는 Unchecked Exception을 선호합니다.

 


3. 예외 처리의 기본 문법: try-catch-finally

가장 표준적인 방법입니다.

Java
try {
    // 1. 실행할 코드 (예외가 발생할 가능성이 있는 곳)
    int result = 10 / 0; 
} catch (ArithmeticException e) {
    // 2. 예외 발생 시 처리할 로직
    System.out.println("0으로 나눌 수 없습니다: " + e.getMessage());
} finally {
    // 3. 예외 발생 여부와 상관없이 무조건 실행 (주로 리소스 반납)
    System.out.println("작업을 종료합니다.");
}

4. 자바 7의 혁신: try-with-resources

파일이나 DB 연결처럼 사용 후 반드시 닫아야 하는 리소스는 finally에서 close()를 호출해야 했습니다. 하지만 자바 7부터는 훨씬 간결해졌습니다.

Java
// 별도로 close()를 호출하지 않아도 블록이 끝나면 자동 반납됨
try (FileReader reader = new FileReader("test.txt")) {
    int data = reader.read();
} catch (IOException e) {
    log.error("파일 읽기 실패", e);
}

5. 예외 던지기: throws vs throw

  • throw: 개발자가 직접 예외를 발생시킬 때 사용합니다. (throw new RuntimeException();)
  • throws: 메서드 선언부에 사용하여, 이 메서드를 호출하는 쪽으로 예외 처리를 떠넘길 때 사용합니다.
Java
public void process(int age) throws IllegalArgumentException { // 예외 떠넘기기
    if (age < 0) {
        throw new IllegalArgumentException("나이는 음수일 수 없습니다."); // 직접 발생
    }
}

 


6. 실무에서 빛나는 예외 처리 전략 (Best Practices)

① 예외를 잡아서 숨기지 마세요 (Empty Catch)

Java
// 절대 금지! 에러가 왜 났는지 영원히 알 수 없게 됩니다.
try { ... } catch (Exception e) { } 

② 비즈니스 예외는 커스텀 예외로 만드세요

단순히 RuntimeException을 던지는 것보다, 어떤 비즈니스 로직에서 에러가 났는지 명시하는 것이 유지보수에 좋습니다.

Java
public class UserNotFoundException extends RuntimeException {
    public UserNotFoundException(String message) {
        super(message);
    }
}

③ 로그를 남길 때는 스택 트레이스를 포함하세요

e.getMessage()만 남기면 어디서 에러가 시작되었는지 알 수 없습니다. log.error("메시지", e) 처럼 예외 객체 자체를 넘기세요


7. 결론: 예외 처리는 '친절함'이다

예외 처리는 단순히 프로그램이 꺼지지 않게 만드는 작업이 아닙니다. 사용자에게는 적절한 안내 메시지를 주고, 동료 개발자에게는 디버깅의 단서를 제공하는 친절한 행위입니다.

오늘 배운 try-with-resources와 Custom Exception 전략을 사용해 더 견고한 자바 코드를 만들어 보세요!