Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

Python try-finally 절 완벽 가이드: 예외와 무관하게 반드시 실행되는 코드

try-finally란?

Python에서는 try 블록과 함께 finally 블록을 사용할 수 있습니다. finally 블록은 try 블록에서 예외가 발생했는지 여부와 상관없이 반드시 실행해야 하는 코드를 작성하는 공간입니다. 파일 닫기, 리소스 해제, 연결 종료처럼 어떤 경우에도 수행되어야 하는 정리(cleanup) 작업을 처리할 때 특히 유용합니다.

try-finally 기본 문법

try:
    # 여기서 원하는 작업을 수행합니다.
    # ......................
    # 예외가 발생하면 이 부분은 건너뛰어질 수 있습니다.
finally:
    # 이 부분은 항상 실행됩니다.
    # ......................

단, finally 절과 함께 else 절은 사용할 수 없습니다.

예제 1: finally 블록의 기본 동작

#!/usr/bin/python3
try:
    fh = open("testfile", "w")
    fh.write("This is my test file for exception handling!!")
finally:
    print("Error: can't find file or read data")

쓰기 모드로 파일을 열 권한이 없어 예외가 발생하면, try 블록의 나머지 코드는 건너뛰고 finally 블록이 실행되어 다음과 같은 결과가 출력됩니다.

출력 결과

Error: can't find file or read data

이 예제는 finally 블록이 예외 발생 여부와 관계없이 항상 실행된다는 점을 잘 보여 주지만, 파일 열기에 성공한 경우에도 오류 메시지가 출력된다는 한계가 있습니다. 같은 로직을 더 깔끔하고 실용적으로 작성하면 다음과 같습니다.

예제 2: 더 깔끔하게 작성하기

#!/usr/bin/python3
try:
    fh = open("testfile", "w")
    try:
        fh.write("This is my test file for exception handling!!")
    finally:
        print("Going to close the file")
        fh.close()
except IOError:
    print("Error: can't find file or read data")

try-finally의 실행 흐름

try 블록에서 예외가 발생하면 프로그램의 실행 흐름은 즉시 finally 블록으로 넘어갑니다. finally 블록의 모든 문장이 실행된 후에는 예외가 다시 발생(raise)하며, 바깥쪽 상위 계층의 try-except 문에 except 절이 있다면 그곳에서 예외가 처리됩니다.

정리하면 다음과 같습니다.
1. try 블록 실행 중 예외가 발생한다.
2. finally 블록이 예외 여부와 관계없이 반드시 실행된다.
3. finally 실행이 끝나면 예외가 상위 try-except 블록으로 전달되어 처리된다.

참고: with 문이라는 더 나은 대안

파일을 다룰 때는 Python의 with 문을 사용하는 것이 좋습니다. with 문은 코드 블록이 정상적으로 끝나거나 예외가 발생하더라도 파일을 자동으로 닫아 주므로, finally 블록에서 직접 close()를 호출하는 번거로움을 없애 줍니다.

with open("testfile", "w") as fh:
    fh.write("This is my test file for exception handling!!")