파이썬으로 작업하다보면 예외 처리시, finally 블록을 사용하는 것을 곧잘 목격할 수 있습니다.
finally는 언제 사용하는 것일까요?
이 finally 블록은 예외 발생 여부와 상관없이 반드시 실행해야 할 명령을 지정합니다.
이해를 돕기 위해 예를 들어보겠습니다.
어떠한 데이터 분석과제를 위해 모든 gpu자원을 하나의 계정(user A)으로 할당해주었습니다.
그렇다면 동일한 서버 내 다른 유저(user B)는 사용중인 gpu에 접근할 수 없을 것입니다.
이때 만약에 user A가 딥러닝을 돌려놓고 밥먹으러 나갔다면, 또는 외출했다고 가정해보겠습니다.
user B는 gpu를 활용해야 하지만, user A가 사용하고 있어서 활용하지 못하게 됩니다.
하지만 user A의 딥러닝 코드가 에러가 났다면, 다른 사람들을 위해 자원 할당을 해제해줘야합니다.
별다른 처리를 하지 않았다면, 에러가 나더라도 gpu 자원이 user A에게 할당되어 있을 것입니다.
그렇다면 user B는 해야할 일이 있음에도 user A가 돌아와서 접속을 끊을 때까지 기다릴수밖에 없는 상황에 직면할 수 있습니다.
이럴 때 finally를 사용할 수 있습니다.
아래 예제를 보겠습니다.
try:
print('네트워크 접속')
a = 2 / 0 # zero division error
print('네트워크 통신 수행')
finally:
print('접속 해제')
print('작업 완료')
# ---- 출력물 --------
# 네트워크 접속
# 접속 해제
# ---------------------------------------------------------------------------
# ZeroDivisionError Traceback (most recent call last)
# Cell In[21], line 3
# 1 try:
# 2 print('네트워크 접속')
# ----> 3 a = 2 / 0
# 4 print('네트워크 통신 수행')
# 5 finally:
# ZeroDivisionError: division by zero
네트워크 접속한 후, 통신을 수행하고 다 완료하면 접속을 끊는 것이 정상적인 순서입니다.
통신 수행 중에 예외가 발생해서 해제하지 못하면 네트워크는 계속 연결된 상태로 남아 있게 됩니다.
이럴 때 해제 구문을 finally 블록에 작성해 두면 연결이 끊어짐을 보장할 수 있습니다.
try 블록이 정상적으로 실행될 때는 물론이고 예외에 의해 강제로 벗어나더라도 finally 블록을 반드시 실행하도록 되어 있습니다.
심지어 함수 내부의 try 블록에서 return 문으로 함수를 종료하더라도 finally 블록을 실행한 후 리턴하게 되어 있어 정리 코드는 틀림없이 실행됩니다
네트워크 뿐만 아니라 외부의 자원을 사용하는 모든 코드는 해제에 신경 써야 합니다.
특히 파일 입출력 시 파일을 다 사용한 후 반드시 닫아야 하는데 이때도 finally 구문이 유용합니다.
(그러나 파일은 with 구문이 더 편리해 주로 with 구문을 사용합니다)
'파이썬 > 파이썬 기초' 카테고리의 다른 글
[python] 반복자(iterator)와 제너레이터(generator) (0) | 2023.04.05 |
---|---|
[python] is 연산자란? (0) | 2023.03.05 |
[python] 키워드 가변 인수 (keyword variable arguments) (0) | 2023.03.05 |
[python] 함수 - 가변 인수 (0) | 2023.03.05 |