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
- ArithmeticError
- SystemExit
- KeyboardInterrupt
- Exception
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 |