티스토리 뷰

반응형

파이썬 프로그래밍을 하다보면 필연적으로 오류(또는 에러)와 만나게 됩니다. 예상할 수 있는 오류는 쉽게 if문을 통해서 제어를 할 수 있지만 갑자기 뜬금없이 나타나는 오류(Error)를 잡기에는 역부족입니다. 그래서 파이썬에서는 예외처리(Exception Handling)를 제공합니다. 확실한 오류는 물론이고, 예상 못한 오류까지 잡기에는 예외처리가 제격입니다. 예외(Exception)이라는 말이 조금 어렵게 느껴진다면 파이썬에서는 그냥 쉽게 오류, 에러라고 생각하시면 됩니다.


파이썬 예외처리 코드 기본구조

try:

    (예외가 일어날 것 같은 코드, 즉 위험한 코드)

except:

    (예외가 있을 때 실행될 코드)

else:

    (예외가 없을 때 실행될 코드)

finally:

    (예외와 상관없이 무조건 실행될 코드)


try:
    print('##### 예외가 있을 때 #####')
    number = 3 / 0 # 0으로 나누면 ZeroDivisionError 예외가 발생
    print('다음 코드들...')
except:
    print('except 블록')
else:
    print('else 블록')
finally:
    print('finally 블록')

print()

try:
    print('##### 예외가 없을 때 #####')
    number = 3 / 3
    print('다음 코드들...')
except:
    print('except 블록')
else:
    print('else 블록')
finally:
    print('finally 블록')

파이썬 예외처리 코드 기본구조

try 블록에 있는 코드를 실행하다 예외를 만나게 되면 except 블록으로 직행

예외가 있을 때를 except 블록을, 없을 때는 else 블록을 실행한다.

finally 블록은 예외가 있으나 없으나 실행된다.

(위의 코드를 보면 언제 어느 블록이 실행되는지 한눈에 파악할 수 있습니다.)


여러가지 예외(Exception) 처리하기

L = [1, 2, 3]
try:
    #주석을 풀어가면서 하나씩 테스트
    #print(abc) # NameError 발생
    #print(L[7]) # IndexError 발생
    #number = 3 / 0 # ZeroDivisionError 발생
    int('abc') # ValueError 발생
except NameError:
    print('NameError')
except IndexError:
    print('IndexError')
except ZeroDivisionError:
    print('ZeroDivisionError')
except:
    print('모르는 에러!')

여러가지 예외(Exception) 처리하기

예외 종류별로 except문을 사용하여 세밀한 처리를 할 수 있다.

위에서부터 순서대로 예외를 처리하기 때문에 순서가 중요하다.

마지막에 모든 예외를 처리하기 위해서는 except: 또는 except Exception: 을 사용한다.


예외의 종류는 아래의 링크를 참고한다.

https://docs.python.org/3/library/exceptions.html#


예외 변수 사용하기 (except as)

try:
    int('abc') # 예외 발생
except NameError as e:
    print(e)
    print(type(e))
except IndexError as e:
    print(e)
    print(type(e))
except Exception as e:
    print(e)
    print(type(e))

예외 변수 사용하기 (except as)

except Exception as e: 처럼

as 다음에 예외변수를 지정하면 예외관련 정보를 얻을 수 있다.

print(e) - 예외 메시지를 출력한다.

print(type(e)) - 예외의 종류(타입)를 출력한다.


직접 예외 발생시키기 (raise)

try:
    raise Exception('인덱스 오류!')
except Exception as e:
    print(e)
    print(type(e))

직접 예외 발생시키기 (raise)

직접 예외를 발생시키기 위해 raise 키워드를 사용한다.


직접 예외(Exception) 만들기

class TestError(Exception):
    def __init__(self, value):
        self.value = value
    def __str__(self):
        return self.value

try:
    raise TestError('직접만든 오류!')
except Exception as e:
    print(e)
    print(type(e))

직접 예외(Exception) 만들기

Exception 클래스를 상속받아 직접 예외를 만들 수 있다.

str(e) 또는 print(e) 출력을 변경하기 위해서는 __str__ 함수를 재정의해야한다. 

간단하게 예외 메시지를 전달하기 위해서는 그냥 Exception 사용하면 된다.



반응형
댓글