예외 처리: 프로그램의 예상치 못한 종료를 방지하고 안정성을 높이는 방법
예외는 프로그램 실행 중 발생하는 오류 상황을 의미하며, 이를 적절히 처리하지 않으면 프로그램이 비정상적으로 종료될 수 있다. 예외 처리를 통해 오류 발생 시에도 프로그램을 계속 실행하거나 사용자에게 의미 있는 메시지를 전달할 수 있다. 튼튼한 소프트웨어를 만들기 위해 필수적인 요소이다.
1. 개념
예외(Exception)는 프로그램이 실행되는 도중 생기는 오류나 비정상적인 상황을 말한다. 예상치 못한 입력, 파일을 찾을 수 없는 경우, 네트워크 연결 실패 등 원인은 다양하다. 프로그램이 예외를 만나면 정상적인 흐름에서 벗어나 예외 처리 루틴으로 이동한다.
2. 왜 사용하는가
예외 처리가 중요한 이유는 이렇다.
- 안정성 확보. 예외 처리가 없으면 프로그램은 예상치 못한 오류가 나는 순간 갑자기 종료된다. 사용자 경험이 나빠지고 데이터가 손실되기도 한다.
- 오류 메시지 제공. 예외 처리 루틴에서 오류의 원인을 파악해 사용자에게 유용한 정보를 주고 문제 해결을 돕는다.
- 자원 정리. 예외가 생겼을 때 쓰던 자원(파일, 네트워크 연결 등)을 안전하게 해제해 시스템 리크를 막는다.
- 코드 가독성 향상. 오류 처리 로직과 핵심 비즈니스 로직을 분리하면 코드를 읽기 쉽고 고치기도 쉬워진다.
3. 동작 원리
예외 처리는 보통 try-catch 블록으로 구현한다.
try블록은 예외가 생길 만한 코드를 담는다.catch블록은try에서 예외가 나면 실행된다. 특정 유형의 예외만 처리하도록 지정할 수도 있다.finally블록(선택 사항)은try블록의 성공 여부와 상관없이 언제나 실행된다. 자원 해제 같은 작업에 쓴다.
프로그램은 try 블록을 실행하다가 예외가 나면 그 예외를 처리할 catch 블록을 찾는다. 맞는 블록이 있으면 그 안의 코드를 실행하고 없으면 예외는 상위 호출 스택으로 전파된다. finally 블록은 예외 발생 여부와 관계없이 늘 실행되므로 자원 정리 같은 마무리를 맡는다.
4. 코드 예제 (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); // 결과: NaN5. 시간 복잡도와 성능 특성
예외 처리 자체가 시간 복잡도를 늘리지는 않는다. try-catch 블록은 프로그램의 실행 흐름을 제어하는 메커니즘이고, 예외가 자주 터지는 상황에서는 성능이 떨어진다. 반대로 정상적인 경우에 예외가 거의 나지 않는다면 성능 영향은 미미하다.
6. 실무 사용 사례
- 파일 입출력. 파일이 없거나 읽기 권한이 없을 때 나는
FileNotFoundException같은 예외를 처리한다. - 네트워크 통신. 네트워크 연결 실패나 타임아웃 관련 예외를 처리한다.
- 데이터베이스 연동. 데이터베이스 연결 오류나 쿼리 실행 실패를 예외로 잡는다.
- 사용자 입력 유효성 검사. 형식이 잘못된 사용자 입력을 감지해 알맞은 메시지를 띄운다.
7. 주의할 점
- 과도한 예외 처리. 가능한 모든 오류를 예외로 잡을 필요는 없고 오히려 코드만 복잡해진다. 잘 생기지 않거나 심각하지 않은 오류는 넘기거나 로그로 남기는 편이 낫다.
- 특정 예외 유형 지정.
catch블록에서는 되도록 예외 유형을 좁혀 지정해 예상치 못한 예외까지 처리하지 않게 한다. 모든 예외를 한꺼번에 잡는catch (e) { ... }는 좋지 않은 습관이다. - 예외 전파. 그 자리에서 처리할 수 없는 예외는 상위 호출 스택으로 올려 더 높은 수준에서 처리하게 둔다.
8. 핵심 정리
예외 처리는 프로그램의 안정성을 높이고 오류 상황에 제대로 대응하기 위한 필수 기술이다. try-catch 블록을 쓰면 예상치 못한 오류가 나도 프로그램을 계속 실행하면서 사용자에게 유용한 정보를 줄 수 있다. 예외 처리 전략을 잘 세우는 일은 튼튼하고 유지보수하기 좋은 소프트웨어를 만드는 데 큰 몫을 한다.