python

7편 Python 기초 문법: 예외 처리

파이썬 티쳐 2024. 11. 13. 11:24

1. 예외 처리의 기본 개념

1.1 예외(Exception)란 무엇인가

예외는 프로그램 실행 중에 발생하는 오류 상황을 의미합니다. 예외는 프로그램의 비정상적인 종료를 막기 위해 처리되어야 합니다. 예를 들어, 숫자가 아닌 문자를 입력받아야 하는데 숫자를 입력받는 경우나, 존재하지 않는 파일을 열려고 할 때 예외가 발생할 수 있습니다.

1.2 예외 발생과 프로그램의 종료

예외가 발생하면 프로그램은 기본적으로 즉시 종료됩니다. 그러나 예외 처리를 통해 이러한 상황을 제어할 수 있습니다. 예외가 발생하더라도 프로그램이 정상적으로 종료되거나, 다른 방식으로 문제를 해결할 수 있습니다.

1.3 기본 예외 처리 구조 (try, except)

tryexcept 구문을 사용하여 예외를 처리할 수 있습니다. try 블록에 실행할 코드를 작성하고, except 블록에 예외가 발생했을 때의 처리를 명시합니다.

try:
    number = int(input("숫자를 입력하세요: "))
    print(f"입력한 숫자는 {number}입니다.")
except ValueError:
    print("잘못된 값을 입력하셨습니다. 숫자를 입력해야 합니다.")

위 코드에서 숫자가 아닌 값을 입력하면 ValueError가 발생하고, except 블록이 실행됩니다.

1.4 여러 종류의 예외 처리 (예: ValueError, TypeError)

다양한 종류의 예외를 처리할 수 있습니다. try 구문 내에서 여러 종류의 예외가 발생할 수 있으며, 이를 각각 다르게 처리할 수 있습니다.

try:
    number = int(input("숫자를 입력하세요: "))
    result = 10 / number
except ValueError:
    print("유효한 숫자를 입력하세요.")
except ZeroDivisionError:
    print("0으로 나눌 수 없습니다.")

위 코드는 사용자가 0을 입력하면 ZeroDivisionError를 처리하고, 숫자가 아닌 값을 입력하면 ValueError를 처리합니다.

2. 예외 처리의 심화

2.1 elsefinally 절의 사용법

else는 예외가 발생하지 않았을 때 실행되는 코드 블록입니다. finally는 예외 발생 여부와 상관없이 항상 실행됩니다. 자원을 정리할 때 주로 finally를 사용합니다.

try:
    number = int(input("숫자를 입력하세요: "))
except ValueError:
    print("유효한 숫자를 입력하세요.")
else:
    print(f"입력한 숫자는 {number}입니다.")
finally:
    print("프로그램 종료.")

finally는 파일을 닫거나 연결을 끊는 등의 정리 작업을 할 때 유용합니다.

2.2 예외를 직접 발생시키기 (raise)

raise 키워드를 사용하여 원하는 시점에 예외를 직접 발생시킬 수 있습니다.

def check_positive(number):
    if number < 0:
        raise ValueError("양수가 아닙니다.")
    return number

try:
    result = check_positive(-5)
except ValueError as e:
    print(e)

이 코드는 check_positive() 함수에서 음수가 입력되면 ValueError를 발생시킵니다.

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

특정 상황에 맞는 예외를 만들고 싶을 때 사용자 정의 예외를 생성할 수 있습니다. 사용자 정의 예외 클래스는 기본 Exception 클래스를 상속받아 만듭니다.

class NegativeNumberError(Exception):
    def __init__(self, message="음수는 입력할 수 없습니다."):
        self.message = message
        super().__init__(self.message)

def check_number(number):
    if number < 0:
        raise NegativeNumberError()

try:
    check_number(-10)
except NegativeNumberError as e:
    print(e)

2.4 예외 처리의 중요성과 실전에서의 활용

예외 처리는 프로그램의 안정성과 신뢰성을 높이는 중요한 방법입니다. 예상하지 못한 오류가 발생해도 프로그램이 중단되지 않고, 필요한 조치를 취할 수 있습니다. 예외 처리를 통해 시스템 리소스가 적절히 해제되며, 오류 로그를 남겨 디버깅에 도움을 줄 수 있습니다.

3. 예외 처리를 활용한 프로그램

3.1 파일을 읽고 잘못된 데이터 형식을 예외 처리하는 프로그램

파일을 읽으면서 예상치 못한 데이터 형식이 있을 경우 예외를 처리하는 프로그램입니다.

def read_file(file_name):
    try:
        with open(file_name, "r") as file:
            for line in file:
                name, score = line.strip().split(",")
                score = int(score)  # 점수를 숫자로 변환
                print(f"{name}의 점수: {score}")
    except FileNotFoundError:
        print("파일을 찾을 수 없습니다.")
    except ValueError:
        print("잘못된 데이터 형식입니다.")
    finally:
        print("파일 읽기 완료.")

read_file("students.txt")

이 프로그램은 학생들의 이름과 점수가 기록된 파일을 읽고, 데이터 형식이 잘못되었을 경우 예외를 처리합니다.

3.2 사용자가 입력한 값의 유효성을 확인하는 예외 처리 프로그램

사용자가 입력한 값이 숫자인지 확인하고, 유효하지 않은 입력일 경우 예외를 처리하는 프로그램입니다.

def get_number():
    while True:
        try:
            number = int(input("숫자를 입력하세요: "))
            print(f"입력한 숫자는 {number}입니다.")
            break
        except ValueError:
            print("유효한 숫자를 입력하세요.")

get_number()

이 프로그램은 사용자가 유효한 숫자를 입력할 때까지 계속해서 입력을 요청합니다.