프로그래밍/Python

파이썬 예외 처리 완벽 가이드: `try-except` 블록과 실전 활용법

shimdh 2025. 2. 27. 10:10
728x90

소프트웨어 개발에서 예외(Exception) 는 피할 수 없는 요소입니다. 사용자가 잘못된 입력을 제공하거나, 네트워크 연결이 끊기거나, 파일이 존재하지 않는 등 다양한 상황에서 예외가 발생할 수 있습니다. 만약 예외를 적절히 처리하지 않으면 프로그램이 갑작스럽게 종료되어 사용자 경험이 저하되고, 데이터 손실 등의 심각한 문제가 발생할 수도 있습니다.

파이썬에서는 try-except 블록을 활용하여 예외를 효과적으로 처리할 수 있습니다. 이를 통해 프로그램의 안정성을 높이고, 사용자가 오류 상황에서도 적절한 피드백을 받을 수 있도록 만들 수 있습니다. 이번 글에서는 try-except 블록의 기본 개념부터 고급 활용법까지 깊이 있게 다뤄보겠습니다.


🏗 1. try-except 블록의 기본 개념

파이썬에서 예외 처리는 try-except 블록을 사용하여 수행됩니다. 기본적인 구조는 다음과 같습니다.

try:
    # 예외가 발생할 가능성이 있는 코드
except 예외_타입 as e:
    # 예외가 발생했을 때 실행될 코드

🔹 try-except 블록의 요소

  • try 블록: 오류가 발생할 가능성이 있는 코드를 실행하는 부분입니다. 정상적으로 실행된다면 except 블록은 실행되지 않습니다.
  • except 블록: try에서 예외가 발생했을 경우 실행되는 부분입니다. 특정 예외 타입(예: ValueError, ZeroDivisionError)을 지정할 수 있으며, 발생한 오류 메시지를 변수 e로 받을 수도 있습니다.

✅ 예제: try-except의 기본 동작

try:
    num = int(input("숫자를 입력하세요: "))  # 숫자가 아닌 값을 입력하면 ValueError 발생
    result = 10 / num  # 0을 입력하면 ZeroDivisionError 발생
    print("결과:", result)
except ValueError:
    print("잘못된 입력입니다. 숫자를 입력하세요.")
except ZeroDivisionError:
    print("0으로 나눌 수 없습니다.")

위 코드에서:

  • int(input()) 부분에서 숫자가 아닌 값이 입력되면 ValueError가 발생합니다.
  • 0이 입력되면 ZeroDivisionError가 발생합니다.
  • 각각의 예외를 except 블록에서 처리하여 프로그램이 중단되지 않도록 합니다.

🛠 2. 여러 개의 except 블록 활용하기

실제 프로젝트에서는 하나의 try 블록에서 여러 종류의 예외가 발생할 가능성이 큽니다. 이러한 경우, 각각의 예외 타입에 대해 개별 except 블록을 사용할 수 있습니다.

try:
    user_input = input("파일 이름을 입력하세요: ")
    with open(user_input, 'r') as file:
        content = file.read()
    num = int(content)  # 파일 내용이 숫자가 아닐 경우 ValueError 발생
    result = 100 / num  # 0일 경우 ZeroDivisionError 발생
except FileNotFoundError:
    print("파일을 찾을 수 없습니다.")
except ValueError:
    print("파일 내용이 숫자가 아닙니다.")
except ZeroDivisionError:
    print("파일 내용이 0일 경우 연산을 수행할 수 없습니다.")

🧐 다중 예외 처리: 여러 예외를 한 번에 처리

except 블록에서 여러 개의 예외 타입을 한 번에 처리할 수도 있습니다.

try:
    num = int(input("숫자를 입력하세요: "))
    result = 10 / num
except (ValueError, ZeroDivisionError):
    print("잘못된 입력입니다. 숫자를 올바르게 입력하세요.")

이 경우, ValueError 또는 ZeroDivisionError가 발생하면 동일한 오류 메시지를 출력하도록 설정할 수 있습니다.


⚡ 3. 모든 예외를 한 번에 처리하기

모든 종류의 예외를 한 번에 처리하려면 Exception 클래스를 사용할 수 있습니다.

try:
    data = [1, 2, 3]
    print(data[5])  # IndexError 발생
except Exception as e:
    print(f"오류가 발생했습니다: {e}")

이 방식은 간단하고 강력하지만, 모든 예외를 같은 방식으로 처리하면 디버깅이 어려울 수 있으므로 주의가 필요합니다. 가능한 경우, 특정 예외를 명확히 처리하는 것이 바람직합니다.


🔁 4. finally 블록: 항상 실행되는 코드

때때로 예외 발생 여부와 상관없이 실행해야 하는 코드가 있습니다. 예를 들어, 파일을 열었으면 반드시 닫아야 하고, 데이터베이스 연결을 열었으면 닫아야 합니다. 이를 위해 finally 블록을 사용할 수 있습니다.

try:
    file = open("example.txt", "r")
    content = file.read()
except FileNotFoundError:
    print("파일을 찾을 수 없습니다.")
finally:
    print("파일을 닫습니다.")
    if 'file' in locals():
        file.close()

🎯 finally 블록의 특징

  • 예외 발생 여부와 관계없이 항상 실행됩니다.
  • try 블록에서 파일이 정상적으로 열렸는지 확인한 후 finally에서 닫을 수 있습니다.

🔥 5. 사용자 정의 예외 만들기

경우에 따라 기본 예외 클래스만으로는 충분하지 않을 수 있습니다. 이런 경우, 개발자가 직접 사용자 정의 예외(Custom Exception) 를 만들어 사용할 수 있습니다.

class NegativeNumberError(Exception):
    """음수 값이 입력되었을 때 발생하는 예외"""
    pass

def check_positive(value):
    if value < 0:
        raise NegativeNumberError("음수 값은 허용되지 않습니다.")

try:
    num = int(input("양수를 입력하세요: "))
    check_positive(num)
    print(f"입력한 숫자: {num}")
except NegativeNumberError as e:
    print(f"오류 발생: {e}")

위 코드에서 NegativeNumberError는 사용자가 직접 만든 예외입니다. check_positive() 함수에서 음수가 입력되면 NegativeNumberError가 발생하며, 이를 except에서 처리할 수 있습니다.


📌 결론: 안정적인 코드 작성을 위한 예외 처리 전략

예외 처리는 안정적이고 신뢰성 있는 프로그램을 개발하는 데 필수적인 요소입니다. try-except 블록을 활용하면 예상치 못한 오류로 인해 프로그램이 중단되는 것을 방지할 수 있으며, 사용자에게 적절한 피드백을 제공할 수도 있습니다.

🎯 핵심 정리

  • try-except 블록을 사용하여 오류를 처리한다.
  • 여러 개의 except을 활용하면 다양한 예외를 개별적으로 처리할 수 있다.
  • 모든 예외를 Exception으로 처리할 수도 있지만, 특정 예외를 명확하게 처리하는 것이 좋다.
  • finally 블록을 사용하면 예외 발생 여부와 관계없이 특정 코드를 실행할 수 있다.
  • 사용자 정의 예외를 만들어 보다 구체적인 오류 처리가 가능하다.

올바른 예외 처리는 프로그램의 안정성을 높이고, 사용자 경험을 향상시키는 중요한 기술입니다. 다양한 예외 처리 방법을 익혀 실무에서 더욱 견고한 코드를 작성해 보세요! 🚀

728x90