파이썬 예외 처리 메커니즘

파이썬은 실행 중 발생하는 오류와 예외를 관리하기 위해 핵심 기능을 제공합니다. 이 기능을 활용하면 코드 디버깅이 가능합니다.

예외 처리:
단언(Assertions)

파이썬 내장 예외 종류

예외 이름 설명
BaseException 모든 예외의 기본 클래스
SystemExit 인터프리터 종료 요청
KeyboardInterrupt 사용자 입력 중단(보통 ^C)
Exception 일반적인 오류의 기본 클래스
StopIteration 반복자에 값이 없음
GeneratorExit 생성기 종료 알림
StandardError 내장 표준 예외의 기반
ArithmeticError 수치 계산 오류의 기반
FloatingPointError 부동소수점 계산 오류
OverflowError 숫자 연산 범위 초과
ZeroDivisionError 0으로 나누기(모든 데이터형)
AssertionError 단언 실패
AttributeError 객체에 속성이 없음
EOFError 입력 끝(EOF) 도달
EnvironmentError 시스템 오류 기반
IOError 입력/출력 오류
OSError 시스템 오류
WindowsError 시스템 호출 실패
ImportError 모듈/객체 불러오기 실패
LookupError 잘못된 데이터 조회 기반
IndexError 시퀀스에 인덱스 없음
KeyError 매핑에 키 없음
MemoryError 메모리 초과 오류
NameError 선언되지 않은 객체 참조
UnboundLocalError 초기화되지 않은 로컬 변수 참조
ReferenceError 약한 참조가 GC된 객체 접근
RuntimeError 일반적인 실행 오류
NotImplementedError 구현되지 않은 메서드
SyntaxError 파이썬 문법 오류
IndentationError 들여쓰기 오류
TabError 탭과 공백 혼용
SystemError 인터프리터 시스템 오류
TypeError 잘못된 타입 연산
ValueError 잘못된 인수 전달
UnicodeError 유니코드 관련 오류
UnicodeDecodeError 유니코드 디코딩 오류
UnicodeEncodeError 유니코드 인코딩 오류
UnicodeTranslateError 유니코드 변환 오류
Warning 경고 기본 클래스
DeprecationWarning 폐지된 기능 경고
FutureWarning 미래 동작 변경 경고
OverflowWarning 오래된 자동 long 타입 경고
PendingDeprecationWarning 폐지 예정 기능 경고
RuntimeWarning 의심스러운 실행 행동 경고
SyntaxWarning 의심스러운 문법 경고
UserWarning 사용자 코드 생성 경고

1. 예외 정의

예외는 프로그램 실행 중 발생하는 이벤트로, 정상 실행 흐름에 영향을 줍니다.
파이썬이 코드를 처리할 수 없을 때 예외가 발생합니다.
예외는 오류를 나타내는 객체입니다.
예외를 처리하지 않으면 프로그램이 중단됩니다.

2. 예외 처리 구조

예외를 감지하고 처리하려면 try/except 구문을 사용합니다.

try/except 구문은 try 블록에서 발생한 오류를 감지하고, except 블록에서 예외를 처리합니다.

예외를 처리하지 않아도 프로그램이 종료되지 않도록 하려면 try 블록에서 예외를 캐치해야 합니다.

구문:

간단한 try....except...else 구조:

try:
<명령>        # 다른 코드 실행
except <이름>:
<명령>        # try 블록에서 '이름' 예외 발생 시
except <이름>, <데이터>:
<명령>        # '이름' 예외 발생 시 추가 데이터 얻기
else:
<명령>        # 예외 없이 실행 시

try 블록은 현재 프로그램 컨텍스트에 표시되며, 예외 발생 시 이 위치로 돌아옵니다. try 블록 실행 후 실행 흐름은 예외 발생 여부에 따라 달라집니다.

try 뒤의 명령 실행 중 예외 발생 시, 파이썬은 try로 돌아가 첫 번째 일치하는 except 블록을 실행합니다. 예외 처리 후 제어 흐름은 전체 try 구문을 통과합니다(예외 처리 중 새로운 예외 발생 시 제외).
try 뒤 명령 실행 중 예외 발생 시 일치하는 except 블록이 없으면, 상위 try로 예외가 전달되거나 프로그램 최상위에서 종료됩니다(기본 오류 메시지 출력).
try 블록 실행 중 예외 없을 경우, else 블록 실행 후 제어 흐름은 전체 try 구문을 통과합니다.  

1. 여러 예외 유형 처리

동일한 except 블록으로 여러 예외 유형을 처리할 수 있습니다.

try:
    정상 실행 코드
   ......................
except(Exception1[, Exception2[,...ExceptionN]]]):
   위 예외 중 하나 발생 시 실행
   ......................
else:
    예외 없을 시 실행

2. 모든 예외 유형 처리

try:
    정상 실행 코드
   ......................
exceptException as e:
   위 예외 중 하나 발생 시 실행
   ......................
else:
    예외 없을 시 실행

3.try-finally 구문

try:
<명령>
finally:
<명령>    # try 종료 시 항상 실행
raise

4. 예외 매개변수

예외는 매개변수를 가질 수 있으며, 이는 오류 메시지로 출력됩니다.

except 문을 통해 예외 매개변수를 캐치할 수 있습니다.

try:
    정상 실행 코드
   ......................
except ExceptionType, Argument:
    Argument 값 출력 가능...

예외 발생 시 변수는 예외 문장에 포함됩니다. 튜플 형태로 변수는 하나 이상의 값을 받을 수 있습니다.

튜플에는 오류 문자열, 숫자, 위치 등이 포함됩니다.

5. 예외 강제 발생

raise 문을 사용하여 직접 예외를 발생시킬 수 있습니다.

raise 구문 형식:

raise [Exception [, args [, traceback]]]

Exception은 예외 유형(예: NameError), args는 사용자가 제공하는 매개변수입니다. 마지막 매개변수는 선택적입니다(실제로 거의 사용되지 않음).

6. 사용자 정의 예외

새로운 예외 클래스를 생성하여 사용자 정의 예외를 만들 수 있습니다. 예외는 일반적으로 Exception 클래스를 상속합니다.

다음은 RuntimeError와 관련된 예제입니다. 이 예제에서는 RuntimeError를 기반으로 클래스를 생성하여 예외 발생 시 추가 정보를 출력합니다.

try 블록에서 사용자 정의 예외 발생 후 except 블록 실행 시, e 변수는 Networkerror 클래스 인스턴스를 생성합니다.

class CustomException(RuntimeError):
    def __init__(self, arg):
        self.args = arg

이 클래스를 정의한 후, 다음과 같이 예외를 발생시킬 수 있습니다:

try:
    raise CustomException("Bad hostname")
except CustomException,e:
    print e.args

특수 예외 처리 방법

단언(asser)

assert expression[,reason]

assert는 단언 키워드입니다. 이 문장을 실행할 때, 먼저 expression을 검증합니다. expression이 참이면 아무것도 하지 않지만, 거짓이면 예외를 발생시킵니다. reason은 이전에 언급한 예외 클래스 인스턴스와 동일합니다.

컨텍스트 관리(with 문)

try, except, finally 코드가 공유 리소스(파일, 데이터) 할당 및 해제를 보장하기 위해 사용될 때, with 문을 통해 try, except, finally에서 자유로울 수 있습니다! 구문은 다음과 같습니다:  

with context_expr [as var]:  
    with_suite

예시: view plain

>>> with open('/root/test.py') as f:  
...     for line in f:  
...         print line 

with 문을 사용하여 공유 리소스를 사용할 때, 특정 이유로 해제하지 않는 걱정이 필요 없습니다. 그러나 모든 객체가 with 문을 지원하는 것은 아닙니다. 다음은 지원하는 객체 목록입니다:

file

decimal.Context

thread.LockType

threading.Lock

threading.RLock

threading.Condition

threading.Semaphore

threading.BoundedSemaphore

sys 모듈을 통한 예외 정보 얻기

예외 정보를 얻는 또 다른 방법은 sys 모듈의 exc_info() 함수를 사용하는 것입니다. 이 함수는 (예외 클래스, 예외 클래스 인스턴스, 추적 객체)의 3요소 튜플을 반환합니다.

>>> try:  
...     1/0  
... except:  
...     import sys  
...     tuple = sys.exc_info()  
...   
>>> print tuple  
(<type 'exceptions.ZeroDivisionError'>, ZeroDivisionError('integer division or modulo by zero',), <traceback object at 0x7f538a318b48>)  
>>> for i in tuple:  
...     print i  
...   
<type 'exceptions.ZeroDivisionError'> #예외 클래스      
integer division or modulo by zero #예외 클래스 인스턴스  
<traceback object at 0x7f538a318b48> #추적 객체  

태그: 파이썬 예외 처리 예외 처리 구조 단언 문법 컨텍스트 관리 sys 모듈

6월 24일 23:53에 게시됨