
프로그램은 항상 예측 가능한 상황만 만나지 않는다.
사용자의 잘못된 입력, 센서의 이상값, 존재하지 않는 파일, 네트워크 지연 등 다양한 변수가 존재한다.
예외 처리(Exception Handling)는 이런 변수 속에서도 프로그램이 끝까지 안정적으로 실행되도록 만드는 핵심 기술이다.
1. 에러(
Error) VS 예외(Exception)
Error)시스템 레벨 또는 인터프리터가 복구 불가능하다고 판단하는 문제.
예: 메모리 부족, 파이썬 내부 치명적 오류 등
일반적으로 try-except로 처리할 수 없음.
Exception)실행 중 발생하며, 프로그래머가 적절히 처리하면 계속 실행 가능한 문제.
예: 잘못된 입력, 없는 파일 접근 등
try-except 구조로 대응 가능.
2. 예외 처리
프로그램은 실행 환경, 입력 값, 외부 시스템 등 다양한 변수로 인해 정상 흐름에서 벗어나는 상황을 자주 마주한다.
파일 누락, 잘못된 데이터 형식, 통신 지연처럼 예측이 어려운 오류가 발생해도 프로그램이 중단되지 않고 동작을 이어가도록 만드는 구조가 필요하다.
예외 처리는 이러한 상황을 감지하고 복구할 수 있도록 설계된 메커니즘이며, try 블록에서 위험 구간을 감싸고 except에서 문제를 처리함으로써 프로그램의 연속성을 보장한다.
✔ try 블록에서 예외가 발생하면, 해당 예외와 가장 먼저 일치하는 except 블록이 실행되는 흐름 구조.
3. 예외 처리 문법
예외 처리는 핵심 구조인 try-except로 이루어진다.
try블록에서 발생한 예외를 except블록에서 처리한다.
즉, 문제가 날 수 있는 부분을 미리 보호하는 안전망 역할이다.
✔ 예외 발생 가능 영역(try)과 예외 처리 영역(except)의 기본 형태.
4. 자주 발생하는 주요 예외
프로그램을 작성하다 보면 다음 오류들을 자주 마주친다.
IndexError: 리스트 / 튜플 범위를 초과할 때
ValueError: 값이 잘못되었을 때
ZeroDivisionError: 0으로 나누기
NameError: 존재하지 않는 변수
FileNotFoundError: 없는 파일 열기
이들은 처리하지 않으면 프로그램을 멈추게 하는 대표 유형이라 반드시 알아둬야 한다.
5. 예외 처리 패턴
예외 처리는 상황에 따라 다른 전략을 적용할 수 있으며, 다음 네 가지 계층으로 나눌 수 있다.
except
✔ 모든 예외를 한 번에 처리하는 단일 except 사용 예시.
else절 - "문제가 없을 때만"
✔ 예외가 발생하지 않았을 때만 실행되는 else 블록의 활용 예시.
finally절 - "무조건 실행되는 블록"
✔ 예외 여부와 관계없이 반드시 실행되는 finally 블록 예시.
✔ 특정 예외(ValueError)만 선택적으로 처리하는 방식.
✔ 서로 다른 예외 유형을 개별 except 블록으로 분기 처리하는 방식.
as e)
✔ 예외 객체(e)를 통해 오류 메시지와 상세 정보를 확인하는 패턴.
✔ 예외 객체를 활용해 오류 메시지와 예외 타입을 함께 출력하는 예시.
raise - 의도적으로 예외 발생시키기시스템은 잘못된 입력을 자동으로 허용하면 안 된다.
그럴 때 직접 예외를 발생시켜 흐름을 제어한다.
입력 검증, 운영 시스템 보호에 널리 쓰이는 패턴
✔ 조건을 만족하지 않을 때 직접 예외를 발생시키고(ex: ZeroDivisionError), 바깥에서 처리하는 구조.
사용자에게 숫자를 입력 받고, try 안에서 int()함수를 사용해 숫자로 변환해 num 변수에 저장해주세요.
입력 받은 값이 숫자가 아니라면 에러가 발생할 거에요.
예외 상황 발생 시 변수 num은 -1로 저장해주세요.
if, else문을 사용해서 num이 0보다 크면 "0보다 큽니다."를, 아니라면 "숫자가 아닙니다."를 출력해주세요.
✔ 문자 입력 시 발생할 수 있는 예외를 처리하고, 변환 실패 시 기본값(-1)을 사용해 흐름을 이어가는 예제.
숫자 2개, 연산자 1개를 받을 변수를 만들어줍니다.
연산자는 "+ - * /"로 입력 받을 수 있습니다.
예외를 발생시켜줍니다.
반복문을 사용하여 사용자가 올바른 값을 입력할 때 까지 반복해줍니다.
조건문을 사용하여 연산자에 따라 연산을 진행해줍니다.
결과값은 함수를 사용하여 (숫자1, 연산자, 숫자2, "=", 결과값) 양식으로 출력해줍니다.
✔ 연산자 검증, 0 나누기 방지, 잘못된 입력 처리 등 다양한 예외를 단계별로 관리하며 계산기를 구현한 종합 예제.
6. 실무 예시
📌 개요
실제 설비·센서 데이터는 항상 정상값만 들어오지 않는다.
노이즈, 통신 지연, 장비 오작동 때문에 None, 범위 밖 값, 비정상 급등 / 급락 같은 문제가 빈번하다.
잘못된 값을 그대로 다음 단계(제어·분석)로 넘기면 시스템 전체가 오동작할 수 있으므로 입력 단계에서 예외로 감지하고 차단하는 것이 핵심이다.
🧩 코드 예시
✔ 센서 값 누락 여부와 범위 초과 여부를 검사하고, 비정상 값은 예외로 차단하는 입력 단계 검증 로직.
⭐ 핵심 포인트
센서 데이터는 100% 신뢰할 수 없다. ⇒ 반드시 검증 레이어 필요
값이 없거나 범위을 벗어나면 즉시 예외 발생(raise)
예외 처리는 시스템을 보호하는 "방화벽" 역할
잘못된 데이터는 초기에 차단해야 장애가 확산되지 않는다.
📌 개요
건물·공장의 전력 데이터는 보통 1~5분 단위로 계측된다. 이 값들은 EMS/BEMS의 핵심 데이터이며,
피크 관리, 수요 예측, 부하 분석, 요금 최적화 등 거의 모든 분석의 기반이 된다.
그런데 실제 운영 환경에서는 다음 문제가 매우 자주 발생한다:
미터기와의 통신 불량
잘못된 경로 지정 또는 누락된 폴더
CSV를 열고 있는 프로그램 때문에 쓰기 실패
권한 제한으로 인해 파일 저장 불가
이 때문에 전력 로그는 “실패하면 회복이 어려운 데이터”이며 예외 처리로 안정성을 확보하는 것이 필수다.
🧩 코드 예시
✔ 전력 데이터를 CSV에 저장하며, 폴더 생성·권한 오류·기타 예외를 안전하게 처리하는 로깅 구조.
⭐ 핵심 포인트
전력 데이터는 실시간성 + 연속성이 매우 중요 ⇒ 로그가 1회라도 끊기면 고급 분석이 불가능
“파일 경로 오류”와 “권한 오류”는 실무에서 가장 흔한 장애
실패했을 때 즉시 예외 메시지를 남겨야 원인 추적 가능
최소한의 예외 처리만으로도 시스템의 신뢰성을 크게 높일 수 있음
저장 실패 시 재시도 로직·백업 디렉터리를 두는 패턴도 있음
📌 개요
자동제어 로직은 잘못된 입력값이 들어오면 바로 기계가 오작동할 수 있다.
따라서 제어 조건을 해치거나 위험한 값이 입력되면 예외를 발생시키고 안전모드로 전환하는 방식이 많이 사용된다.
이 로직은 실제 HVAC(냉난방공조), Boiler, Chiller 등의 제어 시스템에서 ‘비정상 상황을 감지 → 보호 모드 실행’ 패턴으로 널리 쓰인다.
🧩 코드 예시
✔ 비정상 온도 입력 시 예외를 발생시키고, 안전모드로 전환하는 제어 보호 로직.
⭐ 핵심 포인트
제어 시스템은 잘못 판단하면 비용·안전 모두 위험
위험 값 입력 시 예외 발생 ⇒ 정상 제어 흐름을 즉시 차단
except에서 "안전모드", "Fallback 로직" 적용
유지보수 시 "왜 안전모드로 갔는지" 로그 확인 가능
7. 한눈에 보기(요약)
try: 예외 발생 가능 코드
except: 예외 발생 시 처리
else: 예외 없을 때 실행
finally: 항상 실행
단일 except
특정 예외 처리
여러 예외 분기
예외 객체 활용(as e)
raise: 의도적으로 예외 발생8. 아웃트로
예외 처리는 시스템이 예측 불가능한 상태에서도 안정적으로 동작하도록 만드는 핵심 설계 요소이다.
센서 입력, 데이터 저장, 제어 로직처럼 실제 운영 환경에서 발생하는 다양한 예외 상황을 감지하고 복구할 수 있는 구조 없이는 안정적인 시스템을 구축할 수 없다.
이 문서에서 다룬 예외 처리 기법들은 단순한 오류 대응을 넘어, 안정적·지속적 시스템을 설계하기 위한 기반 기술이다.
적절한 예외 처리 구조는 장애 상황에서도 시스템이 기능을 지속하도록 보증한다.