본문 바로가기
python

파이썬 기초 - 예외처리

by kyeongseo.oh 2025. 3. 19.

기본 예외 처리 문법

Python에서 예외 처리는 try, except 블록을 사용하여 구현한다. 예외 처리의 기본 구조는 다음과 같다.

try:
    # 예외가 발생할 가능성이 있는 코드
    result = 10 / 0  # ZeroDivisionError 발생
except:
    # 예외가 발생했을 때 실행할 코드
    print("오류가 발생했습니다.")

 

하지만 위의 방식은 모든 예외를 동일하게 처리하므로 권장하지 않는다. 대신 특정 예외 유형을 지정하여 처리하는 것이 좋다.

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

 

여러 예외를 처리하는 방법은 다음과 같다.

try:
    # 코드 실행
    num = int(input("숫자를 입력하세요: "))
    result = 100 / num
    print(result)
except ValueError:
    print("유효한 숫자를 입력해주세요.")
except ZeroDivisionError:
    print("0으로 나눌 수 없습니다.")

 

여러 예외를 한 번에 처리할 수도 있다.

try:
    # 코드 실행
    num = int(input("숫자를 입력하세요: "))
    result = 100 / num
    print(result)
except (ValueError, ZeroDivisionError):
    print("입력이 잘못되었거나 0으로 나눌 수 없습니다.")

 

예외 객체에 접근하려면 as 키워드를 사용하면 된다.

try:
    result = 10 / 0
except ZeroDivisionError as e:
    print(f"오류 발생: {e}")  # 오류 발생: division by zero

 

Python에서 Exception 클래스는 대부분의 내장 예외들의 기본 클래스이기 때문에, except Exception: 구문을 사용하면 거의 모든 예외 상황을 한 번에 처리할 수 있다.

try:
    result = 10 / 0
except Exception as e:
    print(f"오류 발생: {e}")

 

자주 사용되는 예외 타입

  1. ValueError: 함수나 연산에 적절한 타입이지만 부적절한 값이 전달될 때 발생
  2. TypeError: 연산이나 함수에 부적절한 타입의 객체가 전달될 때 발생
  3. KeyError: 딕셔너리에 존재하지 않는 키로 접근할 때 발생
  4. IndexError: 시퀀스의 인덱스 범위를 벗어날 때 발생
  5. FileNotFoundError: 존재하지 않는 파일을 열려고 할 때 발생
  6. ImportError: 모듈을 가져오는 데 문제가 있을 때 발생
  7. AttributeError: 객체에 존재하지 않는 속성이나 메서드에 접근할 때 발생

try-except-else-finally 패턴

Python의 예외 처리는 try, except, else, finally 키워드를 사용하여 더 세밀하게 제어할 수 있다.

try:
    # 예외가 발생할 가능성이 있는 코드
    num = int(input("숫자를 입력하세요: "))
    result = 100 / num
except ValueError:
    print("유효한 숫자를 입력해주세요.")
except ZeroDivisionError:
    print("0으로 나눌 수 없습니다.")
else:
    # 예외가 발생하지 않았을 때만 실행
    print(f"결과: {result}")
finally:
    # 예외 발생 여부와 상관없이 항상 실행
    print("프로그램을 종료합니다.")

각 블록의 역할:

  1. try: 예외가 발생할 가능성이 있는 코드 블록
  2. except: 특정 예외가 발생했을 때 실행되는 코드 블록
  3. else: try 블록에서 예외가 발생하지 않았을 때만 실행되는 코드 블록
  4. finally: 예외 발생 여부와 상관없이 항상 실행되는 코드 블록

finally 블록은 리소스 해제와 같은 정리 작업에 주로 사용한다. 파일, 네트워크 연결, 데이터베이스 연결 등의 리소스를 안전하게 닫을 때 사용할 수 있다.

try:
    file = open("example.txt", "r")
    content = file.read()
    # 파일 처리 작업
except FileNotFoundError:
    print("파일을 찾을 수 없습니다.")
finally:
    # 파일이 열렸다면 항상 닫습니다.
    if 'file' in locals() and not file.closed:
        file.close()
        print("파일이 닫혔습니다.")

 

예외 발생 시 조치 방법

exception이 발생할 경우, 오류 메시지 출력 후 계속 실행, 재시도, 시스템 종료 등의 조치를 취할 수 있다.

1. 오류 메시지 출력 후 계속 실행

가장 흔한 방식으로, 오류를 기록하고 프로그램이 계속 실행되도록 한다.

try:
    value = int(input("숫자를 입력하세요: "))
except ValueError:
    print("올바른 숫자가 아닙니다.")
    value = 0  # 기본값 설정
    
# 프로그램이 계속 실행됨
print(f"입력값 또는 기본값: {value}")

2. 오류 로깅 후 계속 실행

심각하지 않은 오류의 경우, 로그를 남기고 프로그램을 계속 실행한다.

import logging

logging.basicConfig(level=logging.INFO)

try:
    result = some_function()
except Exception as e:
    logging.error(f"오류 발생: {e}")
    result = None
    
# 프로그램이 계속 실행됨

3. 오류 메시지 출력 후 종료

치명적인 오류의 경우, 메시지를 출력하고 프로그램을 종료한다.

import sys

try:
    config_file = open("config.json", "r")
except FileNotFoundError:
    print("필수 설정 파일을 찾을 수 없습니다. 프로그램을 종료합니다.")
    sys.exit(1)  # 오류 코드와 함께 종료

댓글