관리 메뉴

A seeker after truth

예외 처리 본문

Programming Language/Python

예외 처리

dr.meteor 2019. 10. 24. 14:00

*본문은 <파이썬 정복>(김상형 저, 한빛미디어, 2018)을 공부하며 작성된 내용입니다.

 

 

1. raise

raise 명령은 고의적으로 예외를 발생시킨다. 작업을 위한 선행 조건이 맞지 않거나, 더이상 진행할 수 없는 치명적인 문제가 발생했을 때 호출원으로 예외를 던져 잘못되었음을 알린다.

def calcsum(n):
    if n<0:
        raise ValueError
    sum = 0
    for i in range(n+1):
        sum += i
    return sum

try:
    print("~-5 =", calcsum(-5))
except ValueError:
    print("Wrong Input")

 

2. finally

finally 블록은 예외 발생 여부와 상관 없이 반드시 실행해야 할 명령을 지정한다. 메모리나 자원을 할당한 후 해제해야 하는데 이런 구문을 finally 블록에 작성하면 좋다.

try:
    print("네트워크 접속")
    a = 2/0
    print("네트워크 통신 수행")
finally:
    print("접속 해제")
print("작업 완료")

위 코드와 같은 경우, try의 2번째 문장을 실행하는 과정에서 ZeroDivisionError가 발생한다. 따라서 finally 블록 안의 명령문을 실행하게 된다. 네트워크에 접속한 후 통신을 수행하고 다 완료하면 접속을 끊는 것이 정상적인 순서이다. 통신 수행 중에 예외가 발생해서 해제하지 못하면 네트워크는 계속 연결된 상태로 남아있게 된다. 이럴 때 해제 구문을 finally 블록에 작성해 두면 연결이 끊어짐을 보장할 수 있다.

finally는 예외 발생 여부와 상관 없이 언제나 실행되는 블록이므로, try 블록이 정상 실행되어도 실행이 된다. 심지어 try 내부에서 return 문으로 함수를 종료하더라도 finally 블록을 실행한 후 리턴하게 되어 있어 정리 코드는 틀림없이 실행된다.

 

네트워크 뿐만 아니라 외부의 자원을 사용하는 모든 코드는 해제에 신경 써야 한다. 파일 입출력은 finally 대신 with 구문을 더 잘 쓴다.