본문 바로가기

코딩/파이썬 기초

파이썬 튜토리얼 039. 오류 처리를 위한 try, except, else, finally 문 그리고 raise 문

오류 처리를 위한 try, except, else, finally 문 그리고 raise 문

파이썬 실행 중 오류가 발생하면 실행중인 프로그램은 종료된다.

오류가 발생했을 때 이를 적절히 처리하여 프로그램이 종료되지 않게 하기 위해 try, except, else, finally 문을 사용한다.

 

다음은 파이썬 실행 중 발생 가능한 오류의 예이다.

 

<코드 1>

print(1/0)

 

 

<코드 2>

print(hello)

 

 

<코드 3>

print(1 + '2')

 

 

try, except, else, finally 문의 구조는 다음과 같으며, else 문과 finally 문의 사용은 선택사항이다.

 

try:
    ...
except:
    ...
else:
    ...
finally
    ...

 

try 문 내에 오류가 없는 코드를 작성한 후 실행시키면, except 문 외 try, else, finally 문 내의 코드가 차례로 실행된다.

 

<코드 4>

try:
    print('try statement')
except:
    print('except statement')
else:
    print('else statement')
finally:
    print('finally statement')

 

 

try 문 내에 1을 0으로 나누는 코드를 추가한 후 실행시키면 except 문의 코드가 실행된다.

 

<코드 5>

try:
    print('try statement')
    print(1/0)
except:
    print('except statement')
else:
    print('else statement')
finally:
    print('finally statement')

 

 

임의 수를 0으로 나누면 ZeroDivisionError 오류가 발생한다. except 문은 발생이 예상되는 오류에 따라 다음의 코드와 같이 확장될 수 있다.

 

<코드 6>

try:
    print('try')
    print(1/0)
except ZeroDivisionError as e:
    print('except ZeroDivisionError')
    print(e)
except:
    print('except')
else:
    print('else')
finally:
    print('finally')

 

 

except 문에는 발생이 예상되는 오류 타입을 하나 이상 정의할 수 있다.

 

<코드 7>

try:
    print('try')
    print(hello)
except (ZeroDivisionError, NameError, TypeError) as e:
    print(e)
except:
    print('except')
else:
    print('else')
finally:
    print('finally')

 

 

어떤 타입의 오류가 발생할지 예상되지 않는 경우 except 문에 Exception 클래스를 사용할 수도 있다.

 

<코드 8>

try:
    print('try')
    with open('dummy.abc') as f_dummy:
        pass
except Exception as e:
    print(e)
else:
    print('else')
finally:
    print('finally')

 

 

ZeroDivisionError, NameError, TypeError 및 FileNotFoundError 등은 Exception 클래스의 서브 클래스(child class)이다.

 

raise 문으로 오류를 발생시킬 수도 있다.

 

<코드 9>

try:
    print('try')
    raise Exception('My Exception Error')
except Exception as e:
    print(e)
else:
    print('else')
finally:
    print('finally')