예외와 예외 처리
포스트
취소

예외와 예외 처리

예외 (Exception)

예외란?

  • 프로그램 실행 중 발생할 수 있는 에러 상황
  • 정상적인 코드 실행을 방해한다.
  • 이를 처리하지 않으면 프로그램이 강제 종료될 수 있다.

예외 종류

파이썬에는 다양한 내장 예외 클래스가 존재한다.
아래는 자주 사용되는 예외 클래스들이다.

  • ZeroDivisionError
    • 0으로 나누려 할 때 발생한다.
  • ValueError
    • 부적절한 값 사용 시 발생한다.
    • 예시 : int(‘hello’)
  • TypeError
    • 잘못된 타입 사용 시 발생한다.
    • 예시 : ‘1’ + 2
  • IndexError
    • 리스트, 튜플 등에서 잘못된 인덱스 접근 시 발생한다.
  • KeyError
    • 딕셔너리에서 존재하지 않는 키를 접근할 때 발생한다.
  • FileNotFoundError
    • 존재하지 않는 파일을 열려고 할 때 발생한다.
  • AttributeError
    • 존재하지 않는 객체의 속성/메서드 접근 시 발생한다.
  • ImportError
    • 모듈을 찾을 수 없거나 가져올 수 없을 때 발생한다.

예외 처리

예외를 처리하려면 어떻게 해야할까?

기본 사용법

try-except 문법을 통해 예외를 처리할 수 있다.

try:
    # 예외가 발생할 가능성이 있는 코드
except 예외종류1:
    # 예외종류1이 발생했을 때 실행할 코드
except 예외종류2:
    # 예외종류1이 발생했을 때 실행할 코드
except 예외종류3:
    # 예외종류1이 발생했을 때 실행할 코드
except 예외종류n:
    # 예외종류n이 발생했을 때 실행할 코드
else:
    # 예외가 발생하지 않았을 때 실행할 코드
finally:
    # 예외 발생 여부와 관계없이 항상 실행할 코드
try:
    x = int(input("숫자 입력: "))
except ValueError:
    print("숫자가 아닙니다.")

as 키워드를 사용하면 발생한 예외에 대한 정보를 가져올 수 있다.

try:
    x = int(input("숫자 입력: "))
except ValueError as e:
    print(f"숫자가 아닙니다. : {e}")

else

else를 사용하면 예외가 발생하지 않았을 때
실행할 코드를 작성할 수 있다.

try:
    # 예외가 발생할 가능성이 있는 코드
except 예외종류:
    # 예외가 발생했을 때 실행할 코드
else:
    # 예외가 발생하지 않았을 때 실행할 코드
try:
    x = int(input("숫자 입력: "))
except ValueError:
    print("숫자가 아닙니다.")
else:
    print("정상 입력되었습니다.")

finally

finally를 사용하면 예외 발생 여부와 관계없이
항상 실행할 코드를 작성할 수 있다.

try:
    # 예외가 발생할 가능성이 있는 코드
except 예외종류:
    # 예외가 발생했을 때 실행할 코드
else:
    # 예외가 발생하지 않았을 때 실행할 코드
finally:
    # 예외 발생 여부와 관계없이 항상 실행할 코드
try:
    x = int(input("숫자 입력: "))
except ValueError:
    print("숫자가 아닙니다.")
else:
    print("정상 입력되었습니다.")
finally:
    print("프로그램 종료")

Exception

만약에 모든 예외를 한꺼번에 처리하고 싶다면
except Exception를 사용하면 된다.

try:
    x = int(input("숫자 입력: "))
except Exception as e:
    print(f"오류가 발생했습니다. : {e}")
else:
    print("정상 입력되었습니다.")
finally:
    print("프로그램 종료")

에러를 직접 발생시키기 (raise)

raise를 사용하면 필요한 상황에 직접 예외를 발생시킬 수 있다.

간단하게 인자로 0만 받아야 하는 함수가 있다고 가정해보자.
raise를 사용하면 특정한 예외를 직접 발생하게 할 수 있다.

def onlyZero(x):
    if x != 0:
        raise Exception("0만 입력 가능합니다.")
    else:
        print("0을 입력하셨습니다.")

그러면 try-except쪽에 해당 예외에 대해서 처리하면 된다.

try:
    num = input("0을 입력해주세요. : ")
    onlyZero(num)
except Exception as e:
    print(f"에러 발생 : {e}")

사용자 정의 예외처리

파이썬에서는 Exception 클래스를 상속받으면
사용자 정의 예외 클래스를 정의할 수 있다.

예를 들어 음수를 입력하면 발생시킬 예외를 정의해보자.

class NegativeNumberError(Exception):
    def __init__(self, value):
        self.value = value
        super().__init__(f"음수는 허용되지 않습니다: {value}")

정의한 예외는 try-except에서 사용할 수 있다.

def check_positive(x):
    if x < 0:
        raise NegativeNumberError(x)
    return x

try:
    check_positive(-5)
except NegativeNumberError as e:
    print(f"예외 처리됨: {e}")

출처

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.