Python 기본

파이썬(Python) 예외 처리 : try, except, else, finally 구문 마스터하기

나루하루001 2025. 6. 6. 23:05
반응형

 



Python 예외 처리의 중요성


프로그래밍을 하다 보면 예상치 못한 오류가 발생하기 마련입니다.

이러한 오류가 발생했을 때 프로그램이 갑자기 중단되지 않고

적절하게 대응할 수 있도록 하는 것이 예외 처리의 목적입니다.

 

Python에서는

try, except, else, finally 구문을 통해

예외 처리를 구현할 수 있습니다.

 

예외 처리를 잘 활용하면 다음과 같은 이점이 있습니다:

  • 프로그램의 안정성 향상
  • 디버깅 용이성 증가
  • 사용자 경험 개선
  • 코드의 유지보수성 향상

이 글에서는 Python의 예외 처리 메커니즘을 초보자도 쉽게 이해할 수 있도록 상세히 설명하겠습니다.

기본 예외 처리 구문 이해하기


Python의 예외 처리는 크게 네 가지 키워드로 구성됩니다:

  • try: 예외가 발생할 가능성이 있는 코드 블록
  • except: try 블록에서 예외가 발생했을 때 실행되는 코드 블록
  • else: try 블록에서 예외가 발생하지 않았을 때 실행되는 코드 블록
  • finally: 예외 발생 여부와 관계없이 항상 실행되는 코드 블록

가장 기본적인 형태의 예외 처리 구문은 다음과 같습니다:

<!-- 기본 예외 처리 구문 -->
try:
    # 예외가 발생할 가능성이 있는 코드
    result = 10 / 0
except ZeroDivisionError:
    # ZeroDivisionError 예외가 발생했을 때 실행되는 코드
    print("0으로 나눌 수 없습니다.")

 

실행 결과

0으로 나눌 수 없습니다.

 

위 예제에서는 10을 0으로 나누려고 시도하여 ZeroDivisionError가 발생하지만,

except 블록에서 이를 처리하여 프로그램이 중단되지 않고 계속 실행됩니다.

다양한 예외 처리 방법


Python에서는 여러 가지 예외를 다양한 방식으로 처리할 수 있습니다.

 

여러 예외 처리하기

 

하나의 try 블록에서 여러 종류의 예외를 처리할 수 있습니다:

<!-- 여러 예외 처리하기 -->
try:
    # 예외가 발생할 가능성이 있는 코드
    num = int(input("숫자를 입력하세요: "))
    result = 100 / num
except ValueError:
    # 입력값이 정수가 아닐 때
    print("정수를 입력해주세요.")
except ZeroDivisionError:
    # 0으로 나누려고 할 때
    print("0으로 나눌 수 없습니다.")
except:
    # 그 외 모든 예외
    print("알 수 없는 오류가 발생했습니다.")

 

예외 객체 활용하기

 

except 문에서 예외 객체를 변수로 받아 활용할 수 있습니다:

<!-- 예외 객체 활용하기 -->
try:
    # 파일 열기 시도
    file = open("없는파일.txt", "r")
except FileNotFoundError as e:
    # 예외 객체 e를 활용
    print(f"파일을 찾을 수 없습니다: {e}")

 

else와 finally 활용하기

 

else와 finally를 활용한 완전한 예외 처리 구문입니다:

<!-- else와 finally 활용하기 -->
try:
    num = int(input("숫자를 입력하세요: "))
    result = 100 / num
except ValueError:
    print("정수를 입력해주세요.")
except ZeroDivisionError:
    print("0으로 나눌 수 없습니다.")
else:
    # 예외가 발생하지 않았을 때 실행
    print(f"계산 결과: {result}")
finally:
    # 항상 실행되는 코드
    print("프로그램을 종료합니다.")

 

여기서 else 블록은

try 블록에서 예외가 발생하지 않았을 때만 실행되며,

finally 블록은 예외 발생 여부와 관계없이 항상 실행됩니다.

🔍 알아두세요!
else 블록은 반드시 except 블록 뒤에 와야 하며, finally 블록은 try 문의 마지막에 위치해야 합니다. else와 finally 블록은 모두 선택적으로 사용할 수 있습니다.

 

반응형

파일 처리 시 예외 처리 활용하기


파일 처리는 예외 처리가 특히 중요한 영역입니다.

파일이 존재하지 않거나, 권한이 없거나, 디스크 공간이 부족할 수 있기 때문입니다.

 

파일 읽기 예외 처리

<!-- 파일 읽기 예외 처리 -->
try:
    with open("data.txt", "r") as file:
        content = file.read()
        print(content)
except FileNotFoundError:
    print("파일을 찾을 수 없습니다.")
except PermissionError:
    print("파일을 읽을 권한이 없습니다.")
except:
    print("파일 읽기 중 오류가 발생했습니다.")

 

finally를 활용한 파일 닫기

 

파일 처리에서 finally는 파일을 항상 닫아주기 위해 특히 유용합니다:

<!-- finally를 활용한 파일 닫기 -->
file = None
try:
    file = open("data.txt", "r")
    content = file.read()
    print(content)
except FileNotFoundError:
    print("파일을 찾을 수 없습니다.")
finally:
    if file:
        file.close()
        print("파일을 닫았습니다.")

 

물론 with 문을 사용하면 finally 블록에서 명시적으로 파일을 닫지 않아도 자동으로 처리됩니다.

이것이 Python에서 권장되는 파일 처리 방식입니다.

사용자 정의 예외 만들기


Python에서는 기본 예외 클래스를 상속받아 사용자 정의 예외를 만들 수 있습니다.

이를 통해 프로그램의 특정 상황에 맞는 예외를 정의할 수 있습니다.

 

사용자 정의 예외 클래스 만들기

<!-- 사용자 정의 예외 클래스 만들기 -->
class InsufficientFundsError(Exception):
    """잔액이 부족할 때 발생하는 예외"""
    def __init__(self, balance, amount):
        self.balance = balance
        self.amount = amount
        self.message = f"잔액 부족: 현재 잔액 {balance}원, 요청 금액 {amount}원"
        super().__init__(self.message)

 

raise를 사용한 예외 발생시키기

 

raise 키워드를 사용하여 직접 예외를 발생시킬 수 있습니다:

<!-- raise를 사용한 예외 발생시키기 -->
class BankAccount:
    def __init__(self, balance=0):
        self.balance = balance
        
    def withdraw(self, amount):
        if amount > self.balance:
            raise InsufficientFundsError(self.balance, amount)
        self.balance -= amount
        return self.balance

# 사용 예시
try:
    account = BankAccount(5000)
    account.withdraw(10000)
except InsufficientFundsError as e:
    print(e)

실행 결과

잔액 부족: 현재 잔액 5000원, 요청 금액 10000원

 

사용자 정의 예외를 사용하면 코드의 가독성이 향상되고, 예외 처리가 더 명확해집니다.

예외 처리 모범 사례


효과적인 예외 처리를 위한 몇 가지 모범 사례를 소개합니다:

 

구체적인 예외 처리하기

 

가능한 한 구체적인 예외를 처리하세요.

모든 예외를 한꺼번에 처리하는 것보다 각 예외 유형에 맞게 처리하는 것이 좋습니다.

<!-- 좋은 예 -->
try:
    # 코드
except ValueError:
    # ValueError 처리
except ZeroDivisionError:
    # ZeroDivisionError 처리

<!-- 나쁜 예 -->
try:
    # 코드
except:
    # 모든 예외 처리

 

최소한의 코드만 try 블록에 넣기

 

try 블록에는 예외가 발생할 가능성이 있는 최소한의 코드만 넣는 것이 좋습니다.

이렇게 하면 어떤 코드에서 예외가 발생했는지 더 명확하게 알 수 있습니다.

<!-- 좋은 예 -->
try:
    value = int(input("숫자 입력: "))
except ValueError:
    print("숫자가 아닙니다.")

# 예외가 발생하지 않는 코드는 try 블록 밖에 둡니다
result = process_value(value)

<!-- 나쁜 예 -->
try:
    value = int(input("숫자 입력: "))
    result = process_value(value)
    display_result(result)
except ValueError:
    print("숫자가 아닙니다.")

 

예외를 무시하지 않기

 

예외를 잡았다면 적절히 처리해야 합니다.

예외를 무시하면 나중에 더 큰 문제가 발생할 수 있습니다.

<!-- 나쁜 예 -->
try:
    important_operation()
except Exception:
    pass  # 예외를 무시함
💡팁
디버깅 시에는 예외 객체의 traceback 정보를 활용하면 오류의 원인을 더 쉽게 파악할 수 있습니다. 다음과 같이 traceback 모듈을 사용해보세요:
import traceback

try:
    # 예외 발생 코드
    1 / 0
except Exception as e:
    print(f"오류 발생: {e}")
    traceback.print_exc()  # 상세한 오류 정보 출력



결론


Python의 예외 처리는

프로그램의 안정성과 견고성을 높이는 중요한 기능입니다.

 

try, except, else, finally 구문을 적절히 활용하면

예상치 못한 상황에서도 프로그램이 우아하게 대응할 수 있습니다.

 

사용자 정의 예외를 만들어 사용하면 더 명확하고 의미 있는 오류 처리가 가능합니다.

 

예외 처리는 단순히 오류를 잡는 것이 아니라,

프로그램이 예측 가능한 방식으로 동작하도록 하는 것입니다.

 

적절한 예외 처리를 통해 사용자 경험을 향상시키고, 디버깅을 용이하게 하며, 코드의 유지보수성을 높일 수 있습니다.

[ 파이썬 관련 블로그 글 목록 ] 

파이썬(Python) 블로그 목록

 

반응형