
※ 에러와 예외의 개요
컴파일(구문) 오류 : 문법이 잘못된 경우 → SyntaxError
예외(Exception) : 실행 도중 외부 요인/입력 문제로 발생 → TypeError, ZeroDivisionError 등
논리적 오류 : 결과가 엉뚱하게 나오는 경우(프로그램은 멈추지 않음)
→ 예외 처리를 하는 이유: 프로그램이 안전하게 계속 실행되도록, 혹은 정상 종료하도록 만들기 위해서.
※ try / except / else / finally
try: 예외가 날 수 있는 코드
except: 특정/전체 예외 처리 블럭
else: 예외가 발생하지 않았을 때만 실행
finally: 예외 발생 여부와 관계없이 항상 실행(자원 정리)
def ten_div(x: int) -> float:
return 10 / x
try:
print(ten_div(0))
except ZeroDivisionError as e:
print("0으로 나누면 안됨:", e)
except TypeError as e:
print("정수만 입력 가능:", e)
except Exception as e:
# 마지막에는 가장 넓은 예외를 처리 (로깅/알림)
print("기타 예외:", type(e).__name__, e)
else:
print("예외 없이 정상 실행")
finally:
print("항상 수행되는 정리 단계")
→ 구체적인 예외부터 처리하고, 가장 마지막에 Exception으로 광범위 처리!
※ raise : 예외를 직접 발생시키기
업무 규칙 위반이나 비정상 상태를 감지했을 때, raise로 의도적으로 예외를 발생시켜 흐름을 제어합니다.
def ten_div(x: int) -> float:
if x == 10:
raise Exception("강제로 예외 발생시킴")
return 10 / x
try:
ten_div(10)
except Exception as e:
print("업무 규칙 위반:", e)
→ 재전파도 가능합니다: raise만 쓰면 현재 예외를 그대로 다시 올림.
try:
ten_div(10)
except Exception:
# 로깅 등 부가 작업 후 다시 올림
raise
→ 사용자 정의 예외로 의미를 더 명확히 할 수 있습니다.
class BusinessRuleError(Exception):
"업무 규칙 위반을 표현하는 사용자 정의 예외"
pass
def register(age: int):
if age < 14:
raise BusinessRuleError("만 14세 미만은 가입 불가")
return "가입 완료"
try:
register(12)
except BusinessRuleError as e:
print("처리 필요:", e)
※ assert : 단언(Asssertion)
개발 중 “이 조건은 반드시 참이어야 한다”는 가정을 코드로 명시. 거짓이면 AssertionError 발생.
x = 5
assert x >= 1, "x는 1 이상이어야 함"
import platform
assert platform.system().upper() == "DARWIN", "Mac OS에서만 동작"
→ assert는 개발/테스트에 유용. (최적화 옵션 -O로 실행 시 비활성화될 수 있음)
※ 자주 만나는 예외 클래스
ZeroDivisionError : 0으로 나눔
TypeError : 자료형이 맞지 않음(정수 대신 문자열 등)
ValueError : 자료형은 맞는데 값이 유효하지 않음
IndexError : 시퀀스 인덱스 범위 초과
KeyError : 딕셔너리에 없는 키 접근
FileNotFoundError : 파일/경로가 없음
AssertionError : assert 실패
RuntimeError : 의미상 일반적인 런타임 문제
# 간단한 데모
try:
d = {"name": "jiwoo"}
print(d["age"]) # KeyError
except KeyError as e:
print("키가 없습니다:", e)
try:
ar = [10, 20]
print(ar[5]) # IndexError
except IndexError as e:
print("인덱스 범위 초과:", e)
try:
int("abc") # ValueError
except ValueError as e:
print("숫자로 변환 불가:", e)
→ except Exception as e로 포괄 처리할 수도 있지만, 가능하면 구체적 예외를 먼저 잡으세요.
※ 디버깅 핵심 팁
1) 에러 메시지를 최대한 구체적으로 출력/로그
2) 예외 객체를 활용해 유형/메시지 확인 (type(e), str(e))
3) 필요하면 재현 가능한 최소 코드로 축소
import sys
try:
10 / 0
except Exception as e:
print("예외 타입:", type(e).__name__)
print("예외 메시지:", e)
# sys.exc_info()는 (예외타입, 예외객체, traceback) 튜플을 제공
etype, eobj, tb = sys.exc_info()
print("sys.exc_info:", etype.__name__)
→ 파일/네트워크 등 외부 자원은 예외 발생과 무관하게 정리해야 하므로 finally 또는 with 문을 사용하세요.
# with 문 (컨텍스트 매니저)로 자원 안전하게 사용
try:
with open("data.txt", "r", encoding="utf-8") as f:
print(f.readline())
except FileNotFoundError:
print("파일이 존재하지 않습니다.")
'2025 현대오토에버 모빌리티 SW 스쿨(클라우드 2기) > 파이썬 이론' 카테고리의 다른 글
| [Python] 웹 프로그래밍 기초와 프레임워크 (0) | 2025.09.21 |
|---|---|
| [Python] 내장 모듈과 표준 라이브러리 활용 (0) | 2025.09.21 |
| [Python] 객체 지향 프로그래밍(OOP) (0) | 2025.09.21 |
| [Python] 함수(Function) 완벽 이해 (0) | 2025.09.21 |
| [Python] 연산자와 제어문 (0) | 2025.09.21 |