본문 바로가기
카테고리 없음

파이썬 오류 예외 처리 최종 가이드: try-except부터 사용자 정의 예외까지

by vibespace 2025. 4. 10.

파이썬 예외 처리란 무엇인가?

프로그래밍을 하다 보면 다양한 오류(예외)를 만나게 됩니다. 특히 파이썬에서는 코드 실행 중 예기치 않은 문제가 발생하면 프로그램이 중단되는데, 이를 방지하기 위해 예외 처리(Exception Handling)가 필요합니다.
파이썬 예외 처리는 프로그램이 예외 상황을 우아하게 처리하고, 중단되지 않도록 도와주는 중요한 기법입니다. 이번 글에서는 try-except 구문부터 사용자 정의 예외까지 파이썬의 예외 처리 방법을 체계적으로 살펴봅니다.

기본적인 try-except 구문의 구조

파이썬에서 예외를 처리하는 가장 기본적인 방법은 try-except 구문입니다. 코드 실행 중 예외가 발생할 수 있는 부분을 try 블록에 작성하고, 예외가 발생했을 때 어떻게 처리할지를 except 블록에 작성합니다.


try:
    x = 10 / 0
except ZeroDivisionError:
    print("0으로 나눌 수 없습니다.")

위 예제에서 ZeroDivisionError는 0으로 나눌 때 발생하는 오류입니다. 해당 오류가 발생하면 프로그램이 멈추는 대신, except 블록의 메시지가 출력됩니다.

여러 예외 처리하기

여러 종류의 예외가 발생할 가능성이 있다면, 각각의 예외를 따로 처리할 수 있습니다.


try:
    value = int(input("숫자를 입력하세요: "))
    result = 10 / value
except ValueError:
    print("숫자가 아닌 값을 입력했습니다.")
except ZeroDivisionError:
    print("0으로 나눌 수 없습니다.")

이처럼 다양한 예외 유형을 세분화하여 구체적인 대응이 가능하다는 점에서 try-except는 매우 유용합니다.

예외 메시지 출력하기

발생한 예외에 대한 자세한 정보를 확인하고 싶을 때는 예외 객체를 변수로 받아 출력할 수 있습니다.


try:
    lst = [1, 2, 3]
    print(lst[5])
except IndexError as e:
    print("예외 발생:", e)

출력 결과는 예외 발생: list index out of range처럼 구체적인 메시지를 보여줍니다.

finally 블록의 활용

finally 블록은 예외 발생 여부와 관계없이 항상 실행됩니다. 주로 리소스를 정리할 때 사용됩니다.


try:
    file = open("example.txt", "r")
    data = file.read()
except FileNotFoundError:
    print("파일이 존재하지 않습니다.")
finally:
    file.close()
    print("파일을 닫았습니다.")

위 예제에서 파일을 읽든 못 읽든, file.close()는 반드시 실행되어 파일 리소스를 해제합니다.

raise 문을 이용한 예외 발생

특정 조건에서 의도적으로 예외를 발생시키고 싶을 때는 raise 문을 사용합니다.


def check_age(age):
    if age < 0:
        raise ValueError("나이는 음수가 될 수 없습니다.")
    print(f"입력한 나이: {age}")

check_age(-1)

이 코드는 ValueError: 나이는 음수가 될 수 없습니다.라는 예외를 강제로 발생시킵니다.

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

내장 예외만으로 충분하지 않을 때는 사용자 정의 예외를 만들어 사용할 수 있습니다. 모든 예외는 Exception 클래스를 상속받아 정의합니다.


class NegativeNumberError(Exception):
    def __init__(self, value):
        super().__init__(f"음수는 허용되지 않습니다: {value}")

def process_number(num):
    if num < 0:
        raise NegativeNumberError(num)
    print("정상 처리:", num)

process_number(-5)

이렇게 정의한 사용자 예외는 특정 도메인 로직에 맞게 더 명확한 의미 전달이 가능하며, 예외 상황을 정교하게 제어할 수 있습니다.

예외 처리 모범 사례

  • 모든 예외를 except로 묶기보다는 명시적으로 처리하세요.
  • try 블록은 짧게, 예외가 발생할 수 있는 최소 범위에만 적용하세요.
  • 로직 오류와 사용자 입력 오류는 구분해서 처리하면 디버깅이 쉬워집니다.
  • finally 블록을 활용하여 파일, 네트워크 등 리소스를 확실히 해제하세요.

마무리: 예외 처리는 코드의 품질을 높입니다

예외 처리는 단순한 오류 방지가 아니라, 프로그램의 안정성과 사용자 경험을 높이는 중요한 요소입니다. try-except로 시작해, raise와 사용자 정의 예외까지 이해한다면 파이썬 예외 처리에 대한 실력이 한층 강화될 것입니다.

꼼꼼한 예외 처리는 예기치 못한 상황에서도 프로그램을 안전하게 실행시켜 주며, 디버깅도 수월하게 해줍니다. 오늘 소개한 내용을 직접 실습해보며, 파이썬 오류 처리 능력을 키워보세요!