[스터디노트] 파이썬 - 예외 처리

소환인·2023년 10월 20일
0

스터디노트

목록 보기
6/48

1. 에러와 예외

에러(Error)

에러는 프로그램이 실행되지 않도록 막는 심각한 문제를 의미합니다. 주로 프로그래머의 실수나 오류로 인해 발생하며, 에러가 발생하면 프로그램은 중단되고 더 이상 진행되지 않습니다. 예를 들어, 문법 오류(Syntax Error)는 코드에 문법적인 오류가 있을 때 발생하는 에러의 한 유형입니다.

예외(Exception)

예외는 프로그램이 실행 중에 발생할 수 있는 예상 가능한 오류를 의미합니다. 예외는 적절한 예외 처리를 통해 프로그램의 중단 없이 처리할 수 있습니다. 예를 들어, 파일을 열려고 했는데 해당 파일이 존재하지 않는 경우, 이는 예외로 간주되며 예외 처리를 통해 사용자에게 알려주거나 다른 조치를 취할 수 있습니다.

차이점

  • 발생 시점: 에러는 주로 프로그램이 실행되기 전에 발생하며, 예외는 프로그램이 실행 중에 발생합니다.
  • 처리 방법: 에러는 코드를 수정하여 해결해야 하며, 예외는 예외 처리를 통해 프로그램 실행을 계속할 수 있습니다.

2. 주요 에러 유형

SyntaxError

  • 정의: 코드에 문법적 오류가 있을 때 발생합니다.
  • 예시: 괄호, 콜론, 인덴테이션 등이 올바르지 않은 경우.
  • 해결 방법: 코드를 검토하고 문법 오류를 수정합니다.
print("Hello, World!"  # SyntaxError

TypeError

  • 정의: 데이터 타입 관련 오류로, 연산이나 함수가 적절하지 않은 타입의 객체에 적용될 때 발생합니다.
  • 예시: 문자열과 숫자를 더하려는 시도 등.
  • 해결 방법: 데이터 타입을 확인하고 필요한 경우 타입 변환을 수행합니다.
result = "Hello" + 5  # TypeError

ValueError

  • 정의: 객체의 값이 적절하지 않거나 예상되는 값의 범위에 없을 때 발생합니다.
  • 예시: 숫자 변환 함수에 숫자 형식이 아닌 문자열을 전달하는 경우 등.
  • 해결 방법: 값의 유효성을 검사하고 적절한 값으로 수정합니다.
int("abc")  # ValueError

FileNotFoundError

  • 정의: 존재하지 않는 파일을 열려고 할 때 발생합니다.
  • 예시: 경로가 잘못되었거나 파일이 삭제된 경우.
  • 해결 방법: 파일 경로를 확인하고, 필요한 경우 파일을 생성하거나 경로를 수정합니다.
with open("non_existent_file.txt", "r") as file:
    content = file.read()  # FileNotFoundError

3. 예외 처리의 중요성

안정성

예외 처리를 통해 프로그램은 예상치 못한 오류 상황에서도 안정적으로 실행될 수 있습니다. 이는 사용자 경험을 향상시키고, 데이터 손실이나 시스템 다운과 같은 심각한 문제를 방지하는 데 도움이 됩니다.

디버깅

예외 처리 메커니즘은 개발자에게 오류에 대한 유용한 정보를 제공합니다. 이 정보를 활용하여 오류의 원인을 빠르게 파악하고 수정할 수 있어, 디버깅 과정이 간소화됩니다.

사용자 경험

적절한 예외 처리를 통해 사용자에게 친숙하고 이해하기 쉬운 오류 메시지를 제공할 수 있습니다. 이는 사용자가 문제를 이해하고 필요한 경우 적절한 조치를 취할 수 있도록 돕습니다.

유연성

예외 처리는 프로그램의 유연성을 향상시킵니다. 다양한 오류 상황에 대응할 수 있게 되어, 프로그램은 다양한 환경과 조건에서도 효과적으로 작동할 수 있습니다.

4. try, except, else, finally 구문

try, except, else, finally 구문을 사용해 예외처리를 할 수 있습니다. 다양한 예외 상황을 효과적으로 처리하고, 프로그램의 안정성과 유연성을 높일 수 있습니다.

try

try 블록은 예외가 발생할 가능성이 있는 코드를 포함합니다. 파이썬 인터프리터는 try 블록의 코드를 실행하다가 예외를 감지하면, 즉시 except 블록으로 이동합니다.

except

except 블록은 try 블록에서 예외가 발생했을 때 실행되는 코드를 포함합니다. 여러 except 블록을 사용하여 다양한 예외 유형을 처리할 수 있습니다.

else

else 블록은 try 블록이 예외 없이 성공적으로 실행되었을 때 실행되는 코드를 포함합니다. 이 블록은 선택적으로 사용할 수 있습니다.

finally

finally 블록은 예외 발생 여부와 관계없이 항상 실행되는 코드를 포함합니다. 이 블록은 주로 리소스를 정리하거나 종료 작업을 수행하는 코드를 포함합니다.

예제 코드

try: # 예외가 발생할 가능성이 있는 코드 
    result = 10 / 0
except ZeroDivisionError:# ZeroDivisionError 예외가 발생했을 때 실행될 코드
    print("0으로 나눌 수 없음!")
else:# 예외가 발생하지 않았을 때 실행될 코드
    print("나누기 성공!")
finally:# 예외 발생 여부와 관계없이 항상 실행될 코드
    print("항상 실행")

try 블록에서 ZeroDivisionError 예외가 발생하므로, 해당 except 블록이 실행됩니다. finally 블록은 예외 발생 여부와 관계없이 항상 실행됩니다.

5. 사용자 정의 예외

기본적으로 제공되는 예외 클래스 외에도 사용자가 직접 예외 클래스를 정의하여 사용할 수 있습니다. 사용자 정의 예외를 사용해서 더 적합한 예외 처리를 구현할 수 있습니다.

사용자 정의 예외 클래스 생성

사용자 정의 예외 클래스를 생성하려면, Exception 클래스 또는 그 하위 클래스를 상속받아 새로운 클래스를 정의합니다. 클래스 내부에는 예외에 대한 설명을 반환하는 __str__ 메서드를 포함할 수 있습니다.

예제 코드

# 사용자 정의 예외 클래스 정의
class MyError(Exception):
    def __init__(self, value):
        self.value = value
    
    def __str__(self):
        return f"MyError 발생: {self.value}"

# 예외 발생 시키기
try:
    raise MyError("에러발생")
except MyError as e:
    print(e)

MyError는 사용자 정의 예외 클래스로, Exception 클래스를 상속받아 정의하였습니다. try 블록 내에서 raise 키워드를 사용하여 MyError 예외를 발생시키고, except 블록에서 이를 처리합니다.

사용자 정의 예외의 활용

사용자 정의 예외는 프로그램의 특정 부분에서만 발생하는 예외, 특정 로직에 관련된 예외 처리, 또는 프로그램의 도메인에 맞는 예외 처리를 구현할 때 유용합니다.

6. 실제 코드 예제

문제 상황

파일에서 데이터를 읽어와서 정수로 변환한 후, 그 합계를 계산하는 프로그램을 작성해보겠습니다. 하지만 파일이 존재하지 않거나, 파일 내용 중 정수로 변환할 수 없는 데이터가 포함되어 있을 수 있습니다.

예외 처리 적용

이러한 예외 상황을 처리하기 위해 try, except 블록을 사용하고, 사용자 정의 예외를 활용하여 더 구체적인 예외 처리를 구현합니다.

코드 예제

class InvalidDataError(Exception):
    """사용자 정의 예외 - 데이터가 유효하지 않을 때 발생"""
    pass

def read_and_sum(filename):
    try:
        with open(filename, 'r') as file:
            data = file.readlines()
            
        total = 0
        for item in data:
            try:
                total += int(item.strip())
            except ValueError:
                raise InvalidDataError(f"유효하지 않은 데이터가 있습니다.: {item.strip()}")
                
        print(f"Total sum: {total}")
        
    except FileNotFoundError:
        print(f"'{filename}'이 존재하지 않습니다.")
    except InvalidDataError as e:
        print(e)

# 파일 이름을 변경하여 FileNotFoundError와 InvalidDataError를 테스트
read_and_sum("data.txt")

코드 설명

  • InvalidDataError는 사용자 정의 예외로, 데이터가 유효하지 않을 때 발생시킵니다.
  • read_and_sum 함수는 파일을 읽고 데이터를 정수로 변환하여 합계를 계산합니다.
  • try 블록 내에서 파일을 열고 데이터를 읽습니다. 만약 파일이 존재하지 않으면 FileNotFoundError가 발생합니다.
  • 데이터를 정수로 변환하는 과정에서 ValueError가 발생할 수 있습니다. 이 경우 InvalidDataError 사용자 정의 예외를 발생시켜 구체적인 오류 메시지를 제공합니다.

7. 코드 리뷰와 마무리

  • 예외 처리의 중요성: 예외 처리를 통해 프로그램의 안정성과 사용자 경험을 향상시킬 수 있습니다. 적절한 예외 처리를 통해 예상치 못한 오류로부터 프로그램을 보호하고, 사용자에게 명확한 오류 메시지를 제공할 수 있습니다.
  • 사용자 정의 예외: 사용자 정의 예외를 활용하면 프로그램의 로직과 도메인에 맞는 예외 처리를 구현할 수 있습니다. 이는 코드의 가독성과 유지 관리성을 향상시키며, 더 구체적이고 상세한 예외 처리를 가능하게 합니다.
  • 실제 코드 예제: 파일에서 데이터를 읽고 처리하는 과정에서 발생할 수 있는 여러 예외 상황을 try, except 블록을 사용하여 처리했습니다. 사용자 정의 예외 InvalidDataError를 통해 더 구체적인 오류 메시지를 제공하였습니다.
profile
돌고돌아

0개의 댓글