본문 바로가기
개발자 기초 & 실무

예외처리(try-catch-finally) 제대로 이해하기 — 실전 에러 대응법

by yamoojin83 2025. 11. 11.

예외처리(try-catch-finally) 제대로 이해하기 — 실전 에러 대응법

자바를 배우다 보면 “try-catch-finally” 구문을 수없이 보게 됩니다.

하지만 막상 실무에서 예외가 터지면 “이걸 왜 쓰는지” “finally는 언제 실행되는지” 헷갈리곤 하죠.

이번 글에서는 초보자도 한 번에 이해할 수 있도록 예외처리의 구조, 흐름, 그리고 실무 활용법을 예제 중심으로 정리했습니다.

 

java 예외처리 try catch finally 구조

1. 예외(Exception)란 무엇인가?

프로그램이 실행 중 예상치 못한 상황에 부딪히면 “예외(Exception)”가 발생합니다.

예를 들어 파일이 없거나, 0으로 나누거나, null 객체를 호출할 때 생기는 오류죠.


int result = 10 / 0; // ArithmeticException 발생

예외처리의 목적은 프로그램이 멈추지 않고, 문제를 ‘우아하게’ 처리하게 만드는 데 있습니다.

즉, 사용자는 오류를 보지 않고 개발자는 원인을 알 수 있게 하는 장치인 셈이에요.

2. try-catch 기본 구조

예외가 발생할 수 있는 코드를 try 블록에 넣고, 문제가 생겼을 때 실행할 코드를 catch 블록에서 처리합니다.

형식은 아래와 같습니다.


try {
    // 예외가 발생할 가능성이 있는 코드
} catch (Exception e) {
    // 예외가 발생했을 때 실행되는 코드
}

💡 예시:


try {
    int result = 10 / 0;
    System.out.println("결과: " + result);
} catch (ArithmeticException e) {
    System.out.println("0으로 나눌 수 없습니다!");
}

결과는 콘솔에 0으로 나눌 수 없습니다! 라고 출력됩니다.

프로그램은 멈추지 않고 정상적으로 종료됩니다.

 

3. finally — 무조건 실행되는 블록

finally 블록은 예외 발생 여부와 관계없이 반드시 실행되는 코드입니다.

주로 파일 닫기, DB 연결 종료, 리소스 정리 등에 사용됩니다.


try {
    FileReader fr = new FileReader("data.txt");
    // 파일 읽기 작업
} catch (FileNotFoundException e) {
    System.out.println("파일을 찾을 수 없습니다.");
} finally {
    System.out.println("리소스 정리 완료!");
}

💡 실행 순서:
1) try 실행 → 2) 예외 발생 → 3) catch 실행 → 4) finally 실행

finally는 return 문이 있어도 무조건 수행됩니다. (단, System.exit() 호출 시는 예외)

4. 여러 예외 처리하기

하나의 try 블록 안에서 여러 종류의 예외가 발생할 수 있다면, catch 블록을 여러 개 작성할 수 있습니다.

가장 구체적인 예외부터 순서대로 배치해야 합니다.


try {
    String s = null;
    System.out.println(s.length());
} catch (NullPointerException e) {
    System.out.println("Null 객체 접근 불가");
} catch (Exception e) {
    System.out.println("기타 예외 발생");
}

주의:
상위 클래스인 Exception을 먼저 작성하면 아래의 구체적인 예외가 도달하지 못합니다.

5. 예외 던지기(throw / throws)

때로는 메서드 내부에서 예외를 직접 처리하지 않고, 호출한 쪽으로 “던지는(throw)” 방식도 사용합니다.

이때는 메서드 선언부에 throws를 명시합니다.


public void readFile(String path) throws IOException {
    FileReader fr = new FileReader(path);
}

💡 활용 예시:
main 메서드에서 try-catch로 처리하면 코드가 깔끔해집니다.


try {
    readFile("data.txt");
} catch (IOException e) {
    System.out.println("파일 읽기 중 오류 발생");
}

6. 실무에서 자주 쓰는 패턴

실무에서는 모든 예외를 콘솔에 출력하기보다는, 로그로 남기고 사용자에게는 친절한 메시지만 보여주는 방식을 선호합니다.

예를 들어 Spring Boot에서는 @ExceptionHandler나 전역 예외 처리용 ControllerAdvice를 사용합니다.


try {
    service.saveUser(user);
} catch (Exception e) {
    log.error("회원 저장 중 오류", e);
    throw new CustomException("서버 내부 오류가 발생했습니다.");
}

이렇게 하면 콘솔에는 구체적인 로그가 남고,
사용자 화면에는 “잠시 후 다시 시도해주세요”라는 메시지만 표시됩니다.

마무리

예외처리는 단순히 오류를 잡는 기술이 아니라, 프로그램의 안정성을 높이는 전략입니다.

try-catch-finally의 실행 순서와 의미를 명확히 이해하면, 에러를 ‘두려운 존재’가 아닌 ‘예상 가능한 상황’으로 다룰 수 있습니다.

다음 글에서는 “화면에서 백단 쿼리로 파라미터 넘기기 — JSP & Servlet 실습”을 다뤄보겠습니다.

실제 웹 요청이 백엔드로 어떻게 전달되는지 알고 싶다면 꼭 이어서 읽어보세요!