본문 바로가기
Language & Tool/Python

🐍try-except부터 사용자 정의 예외까지(Python)

by 박수무당벌레 2025. 6. 15.

1. 핵심 개념

 

예외(Exception) 처리란?

  • 프로그램 실행 중 발생할 수 있는 오류(=예외)에 대해, 적절히 대처해서 프로그램이 강제 종료되지 않도록 하는 구조
    → 문법 오류(SyntaxError) 와는 다름
    런타임 에러 중에서 프로그래머가 처리 가능한 오류
    → try-except, 조건문으로 미리 방지 가능
  • try-except 구문을 통해 예외 처리
    → (기본) try : 코드 블록 시작 ~  except : 예외 발생 시 실행되는 코드 블록(예외 종류 지정 가능)
    → finally : 예외 발생 여부와 관계없이 무조건 마지막에 실행되는 블록, 주로 자원 해제 등에 사용 (exit()나 Kill -1, Ctrl+C 같은 강제 종료 외엔 실행됨)
    → else : 예외가 발생하지 않았을 때 실행되는 블록
    → raise : 예외를 직접 발생시킬 때 사용 (사용자 정의 예외 처리에 사용)
try:
    x = int(input("숫자 입력: "))
    if x < 0:
        raise ValueError("음수 입력 금지")
    result = 10 / x
except ZeroDivisionError:
    print("0으로 나눌 수 없습니다.")
except ValueError:
    print("숫자가 아닙니다.")
else:
    print("결과:", result)
finally:
    print("예외 처리 종료")
※ 예외 발생 하거나 말거나, try나 except 블록에서 return 사용해도, raise로 예외를 던져도 finally는 실행됨
※ 비워두고 싶을땐 pass 사용 (= 아무것도 안 하고 지나가기) 
- 조건문, 함수나 클래스 정의, 예외 처리에서 사용 가능
- 주로 구조를 미리 작성할때 사용
- 예외가 생겨도 무시하고 싶을 때 사용 (But 로그 남기는 것을 권장)
※ Runtime Error (런타임 에러)
- 프로그램 실행 도중 발생하는 모든 오류 (보통 입력, 인덱스, 타입, 메모리, 재귀 문제)
- try-except로 처리 가능한 예외(Exception) 가 하위 개념 ( 런타임 에러 ⊃ 예외 )
- 시스템 오류, OutOfMemory 등 치명적 에러는 처리 불가

 

 

2. 자주 쓰이는 예외 코드

  설명 예시
ZeroDivisionError (ArithmeticError) 0으로 나눌 때 1 / 0
ValueError 잘못된 값  ex) 문자열을 int로 변환 실패 int("abc")
TypeError 잘못된 타입 연산 "1" + 1
IndexError (LookupError) 리스트 인덱스 범위를 벗어났을 때 lst[10] (리스트 길이 < 10)
KeyError 딕셔너리에 없는 키 접근 시 d["없는키"]
AttributeError 존재하지 않는 속성에 접근 시 None.append()
ImportError 모듈을 찾을 수 없을 때 import not_exist
FileNotFoundError 파일을 열려 했지만 존재하지 않을 때 open("없는파일.txt")
NameError 정의되지 않은 변수 사용 print(x) (x 미정의)
RecursionError 재귀 깊이 초과 무한 재귀 함수
MemoryError  (BaseException) 메모리 부족 (너무 큰 리스트/DP 배열 사용) 매우 큰 리스트 생성
SystemExit  (BaseException) sys.exit() 함수가 호출될 때 발생하는 예외
(정상적인 종료를 의미)
exit code를 함께 넘길 수 있음
sys.exit(0)
KeyboardInterrupt  (BaseException) Ctrl + C (또는 인터럽트 시그널)을 눌렀을 때 발생
(사용자에 의해 강제 중단되었음을 뜻함)
 
※ BaseException은 예외 전체의 최상위 클래스, Exception은 일반적인 예외 클래스의 부모
※ MemoryError, SystemExit 은 예외지만 일반적으로 처리하지 않음 (= 처리 어려움)
※ NameError 예시) __init__ 전역에 존재 X (파이썬 모듈 실행 가드는 __name__)
※ ValueError 예시) int("1 3 7 9 5")

 

 

3. (예시) 사용자 정의 예외

class NegativeNumberError(Exception):
    pass

def validate(n):
    if n < 0:
        raise NegativeNumberError("음수 입력 금지")

try:
    validate(-5)
except NegativeNumberError as e:
    print("사용자 정의 예외:", e)