이번 포스트는 파이썬의 try / except / else / finally 블록에 대해 다루고자 한다. 전반적인 내용은 책 '파이썬 코딩의 기술' 8장인 강건성과 성능에 기반한다. 

 

  1. try/except
  2. finally
  3. 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구문도 활용해 봐야겠다. 

 

 

 

 

728x90

+ Recent posts