파이썬 하루 하나씩 배우기 29: 예외 메시지 출력과 finally 사용

파이썬 하루 하나씩 배우기 29: 예외 메시지 출력과 finally 사용

이 글은 파이썬 예외 메시지 출력과 finally 사용을 완전히 이해하기 위한 가이드입니다.

Thank you for reading this post, don't forget to subscribe!

예외 처리 없이 프로그램을 실행하면, 작은 오류 하나로 전체 시스템이 멈출 수 있습니다. 하지만 try-except-finally 구조를 활용하면, 예외 상황에서도 프로그램의 흐름을 제어하고, 필요한 정리 작업을 수행할 수 있습니다.

오늘은 파이썬에서 예외 메시지를 출력하는 방법과 finally 블록의 활용법에 대해 알아보겠습니다.

목차

예외 메시지 출력 방법

파이썬에서는 예외가 발생했을 때, 그 내용을 사용자에게 전달하거나 로그로 남기기 위해 try-except 문에서 예외 객체를 변수로 받아 출력할 수 있습니다.

가장 기본적인 형태는 다음과 같습니다:

try:
    x = int(input("숫자를 입력하세요: "))
    y = 10 / x
except Exception as e:
    print("예외 발생:", e)

여기서 e는 실제로 발생한 예외 객체입니다. 이 객체는 예외의 종류에 따라 다양한 정보를 담고 있죠. 예를 들어, 0을 입력했을 때는 ZeroDivisionError가 발생하고, 그 메시지는 division by zero가 됩니다.

💡 팁: 로그로 남길 때는 logging 모듈과 함께 사용하는 것이 좋습니다. 아래는 예시입니다:

import logging

try:
    x = int(input("숫자 입력: "))
    result = 100 / x
except ZeroDivisionError as e:
    logging.error("0으로 나눌 수 없습니다: %s", e)

finally 블록의 역할과 사용법

finally 블록은 예외 발생 여부와 관계없이 무조건 실행되는 블록입니다. 보통 파일을 닫거나, 연결을 종료하거나, 메모리를 정리할 때 사용됩니다.

예시:

try:
    f = open("data.txt", "r")
    data = f.read()
except FileNotFoundError as e:
    print("파일을 찾을 수 없습니다:", e)
finally:
    f.close()
    print("파일 닫기 완료")

위 코드를 보면, 파일이 없어서 except가 실행되더라도, finally에서 f.close()가 반드시 호출됩니다. 즉, 자원 정리가 안전하게 보장되는 것이죠.

블록역할예외 발생 시 동작
try예외 발생 가능성이 있는 코드 실행예외 발생하면 except로 흐름 이동
except예외 처리지정된 예외 타입이 발생하면 실행
finally정리 작업 (파일 닫기, DB 연결 종료 등)항상 실행됨

예외 처리 시 베스트 프랙티스

예외 처리에서 중요한 건 무조건 try-except를 쓰는 게 아니라, 올바르게 쓰는 것입니다. 지나친 포괄적 예외 처리(except Exception 등)는 문제를 숨길 수 있습니다.

  • 필요한 예외만 지정해서 처리하자: except ValueError:, except ZeroDivisionError:
  • 로그를 남기자: 사용자에게는 알기 쉬운 메시지, 개발자에게는 traceback 정보
  • finally로 자원 정리: DB, 파일, 네트워크 연결은 무조건 정리
  • raise로 재전달 가능: 내부에서 처리 후 바깥으로 전달할 수 있음

팩트 문장: “try 없이 개발하는 건, 안전벨트 없이 고속도로 달리는 것과 같다.”

자주 발생하는 예외와 대응 방법

파이썬에서 초보자들이 자주 마주치는 예외는 몇 가지 패턴으로 분류할 수 있습니다. 그에 맞는 간단한 대응법만 알고 있어도 오류를 훨씬 쉽게 다룰 수 있습니다.

예외 종류설명대응 방법
ZeroDivisionError0으로 나누기입력값 검증으로 0 방지
ValueError자료형 변환 실패int(), float() 사용 시 try 필요
FileNotFoundError존재하지 않는 파일 열기 시os.path.exists()로 체크
IndexError리스트 인덱스 초과길이 조건문으로 보호
KeyError딕셔너리 없는 키 접근get() 또는 in 연산자 사용

이 예외들은 대부분 “예측 가능한 실수”입니다. 사용자의 입력이나 외부 환경에 따라 발생하므로, 미리 대비해두면 부드러운 사용자 경험을 제공할 수 있습니다.

실전 예제: 파일 처리와 예외 처리

파일 입출력은 예외 발생률이 매우 높은 영역입니다. 아래 코드는 파일을 열고, 내용을 읽고, 예외를 처리하며, 마지막에 안전하게 파일을 닫는 예제입니다.

def read_file(filename):
    try:
        f = open(filename, 'r')
        content = f.read()
        print("파일 내용:", content)
    except FileNotFoundError as e:
        print(f"파일을 찾을 수 없습니다: {e}")
    except UnicodeDecodeError as e:
        print(f"파일 인코딩 오류: {e}")
    finally:
        try:
            f.close()
            print("파일 닫기 완료")
        except:
            print("파일 객체가 생성되지 않아 닫을 수 없습니다.")
  • 예외 발생 여부와 관계없이 finally에서 f.close() 시도
  • finally 내에서도 try 중첩 사용 가능 (f가 없을 수도 있기 때문)
  • 이중 보호로 인한 더 안전한 파일 처리

팩트 문장: “finally가 없다면, 열린 파일이 언제까지나 열린 채 남아있을 수도 있다.”

요약 및 마무리

  • 예외 객체 출력을 통해 디버깅이 쉬워짐
  • finally 블록은 자원 정리에 필수
  • 불필요한 포괄 except는 피하고, 명시적 예외 처리 지향
  • 파일, DB, API 등 외부 연동에는 반드시 try-finally 구조 사용

예외는 피할 수 없습니다. 중요한 건 예외가 발생했을 때의 태도입니다. 무너지지 않고, 깔끔하게 마무리할 수 있는 코드가 진짜 강한 코드입니다.

실전 후기 & 꿀팁: 예외는 나의 스승이었다

“예외는 실패가 아니라, 내가 아직 모르는 경계선이었다.”

파이썬을 처음 배울 때는 try 블록조차 부담스러웠습니다. 왜 이렇게 까다롭게 작성해야 하지? 라는 생각도 들었죠. 하지만 어느 날, 실무 프로젝트에서 로그 파일을 열었는데 파일 인코딩 문제가 터지면서 프로그램이 뻗어버렸습니다.

그때 깨달았어요. 내가 컨트롤하지 않은 예외 하나가 얼마나 많은 흐름을 망칠 수 있는지를요. 그 후로는 모든 입출력 작업, 네트워크 통신, 사용자 입력 등 외부 요인에 대해 항상 try-except-finally를 습관처럼 쓰기 시작했습니다.

✔ 예외 처리 실전 꿀팁 정리

  • finally는 무조건 넣자. 자원 정리의 마지막 보루다.
  • 모든 except는 logging과 함께! 콘솔 출력만으로는 나중에 못 찾는다.
  • 사용자에게는 친절하게, 로그엔 정확하게. “문제가 발생했습니다”는 부족하다.
  • try는 최소 범위로. 불필요하게 넓게 쓰면 디버깅 어려워짐

지금은 예외를 볼 때마다 “어, 좋은 수업이 시작되겠군” 하고 받아들입니다. 이상하게 들릴지 몰라도, 에러 메시지는 파이썬이 나에게 말을 거는 방식이니까요.

팩트 문장: “좋은 개발자는 오류를 없애는 사람이 아니라, 오류를 대하는 태도가 준비된 사람이다.”

except 블록에서 예외 메시지를 꼭 출력해야 하나요?
꼭은 아니지만 출력하는 것이 디버깅이나 문제 분석에 매우 유리합니다. 특히 로깅과 함께 사용하면 실전에서 큰 도움이 됩니다.
finally는 예외가 발생하지 않아도 실행되나요?
네. finally는 예외 발생 여부와 관계없이 항상 실행됩니다. 자원 정리 또는 종료 메시지 출력 등에 적합합니다.
finally 블록 안에서도 에러가 날 수 있나요?
그렇습니다. 예를 들어 닫으려는 파일 객체가 None인 경우, close() 호출 시 AttributeError가 발생할 수 있으니, 내부에도 try를 사용하는 것이 안전합니다.
except에서 어떤 예외인지 꼭 지정해야 하나요?
가능하면 예외를 명시적으로 지정하는 것이 좋습니다. except Exception처럼 포괄적 처리하면 디버깅이 어려워질 수 있습니다.
try 없이 finally만 사용할 수 있나요?
아니요. finally는 반드시 try와 함께 사용해야 하며, 단독으로 쓸 수 없습니다. 항상 try-finally 또는 try-except-finally 구조를 유지해야 합니다.

시각 자료 및 참고 링크

파이썬의 예외 처리와 finally 블록의 중요성을 시각적으로 이해하기 위해 아래의 이미지를 참고하세요.


파이썬 예외 처리 흐름도

위 이미지는 try-except-finally 구조의 실행 흐름을 도식화한 것으로, 예외 발생 여부와 관계없이 finally 블록이 실행되는 것을 보여줍니다.

이러한 자료들을 통해 예외 처리의 중요성과 finally 블록의 역할을 더욱 깊이 있게 이해할 수 있습니다.

마무리하며: 예외는 피할 수 없다면, 정면으로 마주하라

파이썬에서의 예외 처리는 단순히 에러를 잡기 위한 기술이 아닙니다. 그것은 코드의 안정성과 신뢰성을 높이는 ‘태도’입니다. 특히 finally 블록은 우리가 코드의 마지막까지 책임진다는 선언과도 같죠.

처음엔 복잡해 보일 수 있지만, 실전에서 만나는 수많은 예외는 결국 ‘예상하지 못한 상황에 대비하는 연습’이자, 개발자의 성장을 이끄는 중요한 발판이 됩니다.

예외는 회피할 수 없지만, 어떻게 다루느냐는 전적으로 우리의 선택입니다. 오늘 배운 내용을 프로젝트에 적용하며, 더욱 단단한 코드를 만들어 보세요!

이 글이 도움이 되었나요?

★★★★★

포커스 키워드: 파이썬 예외 메시지 출력, finally 블록

메가 설명: 파이썬의 예외 처리에서 메시지를 출력하는 방법과 finally 블록을 활용한 정리 작업까지, 실전 예제와 꿀팁을 통해 쉽게 배워보는 하루 하나씩 파이썬 블로그 시리즈.

slug: python-try-except-finally-29

파이썬 예외 처리 구조 요약 다이어그램

[출처: Medium Python Try/Except Architecture]


HANSORI.AI_Blog Labs에서 더 알아보기

구독을 신청하면 최신 게시물을 이메일로 받아볼 수 있습니다.