본문 바로가기
TYLER SONG2026
블로그 목록
computer science

예외 처리: 프로그램의 예상치 못한 종료를 방지하고 안정성을 높이는 방법

예외는 프로그램 실행 중 발생하는 오류 상황을 의미하며, 이를 적절히 처리하지 않으면 프로그램이 비정상적으로 종료될 수 있다. 예외 처리를 통해 오류 발생 시에도 프로그램을 계속 실행하거나 사용자에게 의미 있는 메시지를 전달할 수 있다. 튼튼한 소프트웨어를 만들기 위해 필수적인 요소이다.

송민성3분 읽기

1. 개념

예외(Exception)는 프로그램이 실행되는 도중 생기는 오류나 비정상적인 상황을 말한다. 예상치 못한 입력, 파일을 찾을 수 없는 경우, 네트워크 연결 실패 등 원인은 다양하다. 프로그램이 예외를 만나면 정상적인 흐름에서 벗어나 예외 처리 루틴으로 이동한다.

2. 왜 사용하는가

예외 처리가 중요한 이유는 이렇다.

  • 안정성 확보. 예외 처리가 없으면 프로그램은 예상치 못한 오류가 나는 순간 갑자기 종료된다. 사용자 경험이 나빠지고 데이터가 손실되기도 한다.
  • 오류 메시지 제공. 예외 처리 루틴에서 오류의 원인을 파악해 사용자에게 유용한 정보를 주고 문제 해결을 돕는다.
  • 자원 정리. 예외가 생겼을 때 쓰던 자원(파일, 네트워크 연결 등)을 안전하게 해제해 시스템 리크를 막는다.
  • 코드 가독성 향상. 오류 처리 로직과 핵심 비즈니스 로직을 분리하면 코드를 읽기 쉽고 고치기도 쉬워진다.

3. 동작 원리

예외 처리는 보통 try-catch 블록으로 구현한다.

  • try 블록은 예외가 생길 만한 코드를 담는다.
  • catch 블록은 try에서 예외가 나면 실행된다. 특정 유형의 예외만 처리하도록 지정할 수도 있다.
  • finally 블록(선택 사항)은 try 블록의 성공 여부와 상관없이 언제나 실행된다. 자원 해제 같은 작업에 쓴다.

프로그램은 try 블록을 실행하다가 예외가 나면 그 예외를 처리할 catch 블록을 찾는다. 맞는 블록이 있으면 그 안의 코드를 실행하고 없으면 예외는 상위 호출 스택으로 전파된다. finally 블록은 예외 발생 여부와 관계없이 늘 실행되므로 자원 정리 같은 마무리를 맡는다.

4. 코드 예제 (TypeScript)

typescript
function divide(a: number, b: number): number { try { if (b === 0) { throw new Error("0으로 나눌 수 없습니다."); // 에러 객체 생성 및 throw } return a / b; } catch (error: any) { // error는 any 타입이거나, 정의된 예외 클래스 타입을 사용 console.error("오류 발생:", error.message); // 오류 메시지 출력 return NaN; // NaN 반환하여 처리 } finally { // 항상 실행되는 코드 (예: 로그 기록) console.log("나눗셈 연산 완료."); } } const result = divide(10, 0); console.log("결과:", result); // 결과: NaN

5. 시간 복잡도와 성능 특성

예외 처리 자체가 시간 복잡도를 늘리지는 않는다. try-catch 블록은 프로그램의 실행 흐름을 제어하는 메커니즘이고, 예외가 자주 터지는 상황에서는 성능이 떨어진다. 반대로 정상적인 경우에 예외가 거의 나지 않는다면 성능 영향은 미미하다.

6. 실무 사용 사례

  • 파일 입출력. 파일이 없거나 읽기 권한이 없을 때 나는 FileNotFoundException 같은 예외를 처리한다.
  • 네트워크 통신. 네트워크 연결 실패나 타임아웃 관련 예외를 처리한다.
  • 데이터베이스 연동. 데이터베이스 연결 오류나 쿼리 실행 실패를 예외로 잡는다.
  • 사용자 입력 유효성 검사. 형식이 잘못된 사용자 입력을 감지해 알맞은 메시지를 띄운다.

7. 주의할 점

  • 과도한 예외 처리. 가능한 모든 오류를 예외로 잡을 필요는 없고 오히려 코드만 복잡해진다. 잘 생기지 않거나 심각하지 않은 오류는 넘기거나 로그로 남기는 편이 낫다.
  • 특정 예외 유형 지정. catch 블록에서는 되도록 예외 유형을 좁혀 지정해 예상치 못한 예외까지 처리하지 않게 한다. 모든 예외를 한꺼번에 잡는 catch (e) { ... }는 좋지 않은 습관이다.
  • 예외 전파. 그 자리에서 처리할 수 없는 예외는 상위 호출 스택으로 올려 더 높은 수준에서 처리하게 둔다.

8. 핵심 정리

예외 처리는 프로그램의 안정성을 높이고 오류 상황에 제대로 대응하기 위한 필수 기술이다. try-catch 블록을 쓰면 예상치 못한 오류가 나도 프로그램을 계속 실행하면서 사용자에게 유용한 정보를 줄 수 있다. 예외 처리 전략을 잘 세우는 일은 튼튼하고 유지보수하기 좋은 소프트웨어를 만드는 데 큰 몫을 한다.

© 2026 Tyler Song