Python - 8. 예외 처리

2025. 1. 19. 19:16프로그래밍 언어/Python

Python에서는 프로그램 실행 중 발생하는 오류를 예외(Exception)라고 합니다. 예외 처리를 통해 오류를 적절히 처리하여 프로그램이 중단되지 않도록 할 수 있습니다. 이 섹션에서는 예외 처리의 기본 문법과 고급 활용 방법을 다룹니다.


8.1 try, except, else, finally

try 블록에서 예외가 발생하면, except 블록이 실행됩니다. else 블록은 예외가 발생하지 않았을 때 실행되며, finally 블록은 예외 발생 여부와 관계없이 항상 실행됩니다.

기본 구조

try:
    # 예외가 발생할 가능성이 있는 코드
    x = 10 / 2
except ZeroDivisionError:
    # 예외 처리 코드
    print("0으로 나눌 수 없습니다.")
else:
    # 예외가 발생하지 않았을 때 실행되는 코드
    print("정상적으로 실행되었습니다.")
finally:
    # 항상 실행되는 코드
    print("프로그램 종료.")

실행 결과

정상적으로 실행되었습니다.
프로그램 종료.

8.2 예외 객체 다루기

except 블록에서 예외 객체를 다뤄 추가적인 정보를 얻을 수 있습니다.

예외 객체 사용법

try:
    x = 10 / 0
except ZeroDivisionError as e:
    print(f"예외 발생: {e}")

실행 결과

예외 발생: division by zero

모든 예외 처리와 bare except 피하기

모든 예외를 포괄적으로 처리하려면 Exception을 사용합니다. 그러나 bare except (예: except:)는 예상치 못한 오류를 숨길 수 있으므로 사용을 피하는 것이 좋습니다.

try:
    x = 10 / 0
except Exception as e:
    print(f"예외 발생: {e}")

예외 계층 구조

Python 예외는 계층 구조로 구성되어 있으며, 모든 예외는 BaseException 클래스를 상속합니다. 주요 계층 구조는 다음과 같습니다:

  • BaseException
    • Exception
      • ArithmeticError
        • ZeroDivisionError
        • OverflowError
      • ValueError
      • TypeError
    • SystemExit
    • KeyboardInterrupt

8.3 사용자 정의 예외

Python에서는 기본 예외 외에도 사용자 정의 예외를 만들 수 있습니다.

사용자 정의 예외 클래스

사용자 정의 예외 클래스는 반드시 Exception 클래스를 상속해야 합니다.

class CustomError(Exception):
    """사용자 정의 예외 클래스"""
    def __init__(self, message):
        self.message = message
        super().__init__(message)

# 사용자 정의 예외 발생시키기
try:
    raise CustomError("이것은 사용자 정의 예외입니다.")
except CustomError as e:
    print(f"사용자 정의 예외 발생: {e}")

8.4 실용적인 예제

파일 처리에서의 예외 처리

try:
    with open("example.txt", "r") as file:
        content = file.read()
        print(content)
except FileNotFoundError:
    print("파일을 찾을 수 없습니다.")
except IOError as e:
    print(f"파일 처리 중 오류 발생: {e}")

네트워크 통신에서의 예외 처리

import requests

try:
    response = requests.get("https://example.com")
    response.raise_for_status()
    print(response.text)
except requests.exceptions.HTTPError as e:
    print(f"HTTP 오류 발생: {e}")
except requests.exceptions.RequestException as e:
    print(f"요청 오류 발생: {e}")

데이터베이스 작업에서의 예외 처리

import sqlite3

try:
    conn = sqlite3.connect("example.db")
    cursor = conn.cursor()
    cursor.execute("SELECT * FROM users")
    rows = cursor.fetchall()
    print(rows)
except sqlite3.Error as e:
    print(f"데이터베이스 오류 발생: {e}")
finally:
    conn.close()

8.5 컨텍스트 관리자와 예외 처리

with 문은 파일과 같은 리소스를 안전하게 열고 닫는 데 유용합니다. with 문은 내부적으로 예외 처리를 포함하여 리소스를 정리합니다.

try:
    with open("example.txt", "r") as file:
        content = file.read()
        print(content)
except FileNotFoundError:
    print("파일을 찾을 수 없습니다.")

8.6 예외 처리의 성능과 로깅 활용

예외 처리의 성능

예외는 일반적인 흐름 제어로 사용하는 것이 비효율적일 수 있습니다. 따라서 성능이 중요한 코드에서는 예외가 자주 발생하지 않도록 설계해야 합니다.

로깅 활용

예외 처리 시 디버깅과 문제 추적을 위해 로깅을 사용하는 것이 좋습니다.

import logging

logging.basicConfig(level=logging.ERROR, filename="error.log")

try:
    x = 10 / 0
except ZeroDivisionError as e:
    logging.error(f"예외 발생: {e}")

이번 섹션에서는 Python의 예외 처리 문법, 계층 구조, 사용자 정의 예외, 그리고 실용적인 활용 예제를 다뤘습니다.

'프로그래밍 언어 > Python' 카테고리의 다른 글

Python - 10. 모듈과 패키지  (0) 2025.01.19
Python - 9. 객체 지향 프로그래밍  (0) 2025.01.19
Python - 7. 파일 입출력  (0) 2025.01.19
Python - 6. 딕셔너리와 튜플  (0) 2025.01.19
Python - 5. 함수  (0) 2025.01.19