이번 포스트는 파이썬의 try / except / else / finally 블록에 대해 다루고자 한다. 전반적인 내용은 책 '파이썬 코딩의 기술' 8장인 강건성과 성능에 기반한다.
- try/except
- finally
- else
이전 글 : 2022.03.01 - [파이썬] - Thread - 파이썬 코딩의 기술 리뷰[동시성과 병렬성 2]
Thread - 파이썬 코딩의 기술 리뷰[동시성과 병렬성 2]
저번 포스트에서 책의 7장 내용인 '동시성(concurrency)과 병렬성(parallelism)'에 대해 간략히 개념을 잡았다. 이번에는 thread의 약간 심화 버전으로 정리를 해보려고 한다. 지난 글: https://hi-lu.tistory.c.
hi-lu.tistory.com
1. try / except
try 안 코드에서 에러가 발생하는 것을 except 블록에서 처리한다. 텍스트 파일을 읽는 예제를 생각해보자. 아래와 같이 파일을 읽는 구문을 try 블록에 넣는다. try except 구문을 쓰지 않았다면, 파일을 읽을 수 없을 때 Error가 발생하고 코드는 중지될 것이다.
with open('sample.txt', 'r')as f:
try:
data = f.readlines()
except:
print('sample.txt 읽을 수 없음')
그러나 try/except 구문을 사용함으로써 이 에러는 except구문에서 잡히게 되고, 코드는 정상적으로 실행된다.
txt파일을 읽을 수 있다면 try 내 코드 잘 실행됨
반대로 txt파일을 읽다가 에러가 발생했다면 'sample.txt 읽을 수 없음'이 출력됨
2. finally
보통 try/except 블록에서 예외 (Exception)을 잡는다. finally 블록은 try 블록이 실행된 다음 항상 실행된다. 즉 finally 블록은 항상 실행된다.
with open('sample.txt', 'r')as f:
try:
data = f.readlines()
except: #try에서 에러가 발생할 시 except 블럭으로 넘어감
print('sample.txt 읽을 수 없음')
finally: #try블록 실행 후 실행. == 항상 실행
f.close()
3. else
try에서 에러가 발생하면 except 블록으로 넘어갔다. 그렇다면 예외가 발생하지 않았다면? 그때는 else 블록으로 넘어갈 수 있다.
이렇게 하면 try에 들어갈 코드가 줄어들어 어디서 에러가 생기는지 좀더 명확하게 볼 수 있다.
with open('example0.txt', 'r')as f:
try:
data = f.readlines()
except:
print('sample.txt 읽을 수 없음')
else:
print(data)
finally:
f.close()
print('파일 닫기')
이 else는 처리할 예외가 없을 경우에 실행하라는 뜻이다. '예외(==except)가 발생하지 않았(==else)다면?'
cf.) else는 재밌는 친구다. 아래와 같이 for문 밑에도 else를 사용할 수 있으며, 문법적으로 틀리지 않다. 코드를 실행시켜보면 알겠지만 for문이 끝나고 else구문이 실행된다! 즉, 위의 블록이 제대로 실행되면 else가 실행된다. 이는 if/else나 위의 try/except/else와는 반대로 보인다.
for i in range(3):
print(i)
else:
print(i) # -> 출력됨
반면 아래와 같은 while문에 break가 있는 경우는 조금 다르다. else 위의 구문인 while가 정상적으로 실행되지 않고, break 문에서 중단되었다고 생각하는 것이다. ( 참고 : https://www.pythontutorial.net/python-basics/python-while-else/ )
i=0
while True:
print(i)
i+=1
if i>=3:
break
else:
print(i) # -> 출력되지 않음
마찬가지로 위 for문에 break를 넣어 볼까? 그러면 else가 작동하지 않은 것을 알 수 있다. for문이 제대로 실행되지 않고 중단되었다고 본 것이다.
for i in range(3):
print(i)
if i==2:
break
else:
print(i) # -> 출력되지 않음
나는 try / except 구문은 자주 쓰지만 else, finally 블록과는 그리 친하지 않았다. 이번 기회에 실제로 프로그램을 짤 때 finally구문도 활용해 봐야겠다.
'python > 파이썬 코딩의 기술' 카테고리의 다른 글
Python Asyncio (0) | 2022.03.05 |
---|---|
Thread - 파이썬 코딩의 기술 리뷰[동시성과 병렬성 2] (0) | 2022.03.01 |
python3 애트리뷰트, 메타클래스 - 2 (0) | 2022.02.20 |
파이썬 리스트 append 연산 시 arr와 arr[:] 차이점 (0) | 2022.02.12 |
파이썬 코딩의 기술 리뷰 - 메타클래스와 애트리뷰트 1 (0) | 2022.02.01 |