Python에서 사용자 지정 예외 생성

Rayven Esplanada 2023년10월10일
  1. Python에서 사용자 지정 예외 클래스 만들기
  2. Python에서try...except블록을 사용하여 예외 처리 실행
Python에서 사용자 지정 예외 생성

이 자습서는 Python에서 사용자 지정 예외 클래스를 만들 수 있음을 보여줍니다. 여기서는 예외 처리를 올바르게 수행하고, 사용자 지정 예외 클래스를 정의하고, 기존 내장 예외를 재정의하는 방법을 보여줍니다.

예외는 프로그램 내의 무언가가 의도 한대로 진행되지 않거나 프로그램의 의도 된 사용 사례의 흐름을 방해 할 때마다 발생하는 이벤트 유형입니다. 예외 처리가 없으면 프로그램이 완전히 실행되지 않으며 예외를 수정하거나 처리해야합니다.

Python에서 사용자 지정 예외 클래스 만들기

파이썬에서 예외 클래스를 만드는 것은 일반 클래스와 같은 방식으로 수행됩니다. 주요 차이점은 Python의 기본 Exception 클래스를 포함하여 작성중인 클래스가 예외 클래스임을 컴파일러에 알려야한다는 것입니다.

이 메서드를 테스트하여DemoException이라는 예외 클래스를 만들고 자리 표시 자 내부에서 자리 표시 자 제어 흐름 키워드pass를 사용합니다.

class DemoException(Exception):
    pass

Python에서raise키워드를 사용하여 예외 발생 실행

DemoException클래스를 테스트하고 실제로 트리거 될 때 표시되는 내용을 보려면 예외 발생을 수행하십시오. 예외 발생은 다른 프로그래밍 언어에서 예외 발생과 동의어입니다.

raise키워드를 사용하여 주어진 예외 클래스를 사용하여 예외를 트리거하고 예외 메시지를 출력합니다.

class DemoException(Exception):
    pass


raise DemoException

출력:

Traceback (most recent call last):
  File "/Users/demo/python/demo_exception.py", line 4, in <module>
    raise DemoException
__main__.DemoException

사용자 정의 예외 메시지가 선언되지 않은 경우 표준 예외는 터미널에 표시됩니다.

Python에서 사용자 지정 예외 메시지 선언

DemoException에 대한 사용자 정의 예외 메시지를 선언하려면 예외 클래스의__init__()메소드를 재정의하고 필수 자체 참조 매개 변수self와 함께 매개 변수에 예외에 대해 출력되어야하는 메시지를 포함합니다.

예를 들어,__init__()메서드를 재정의하고DemoException클래스에 대한 사용자 지정 메시지를 생성 해 보겠습니다.

class DemoException(Exception):
    def __init__(self, message):
        super().__init__(message)

메시지를 예외에 성공적으로 통합하려면 기본Exception클래스,__init__()메서드를 호출하고message를 인수로 포함합니다.

raise키워드를 사용하여 예외 클래스를 다시 호출하고 이제 사용자 지정 메시지를 함께 전달합니다.

class DemoException(Exception):
    def __init__(self, message):
        super().__init__(message)


message = "Exception Triggered! Something went wrong."
raise DemoException(message)

출력은 다음과 같아야합니다.

Traceback (most recent call last):
  File "/Users/demo/python/helloworld.py", line 6, in <module>
    raise DemoException(message)
__main__.DemoException: Exception Triggered! Something went wrong.

이제 사용자 지정 오류 메시지가 포함 된 예외 클래스를 성공적으로 만들고 트리거했습니다.

예외를 유발할 수있는 실제 상황에서 이러한 예외를 어떻게 처리하고 발생합니까? try...except블록을 사용하여 예외 처리를 구현하면이 문제를 깔끔하게 해결할 수 있습니다.

Python에서try...except블록을 사용하여 예외 처리 실행

try...except블록은 Java와 같은 다른 언어의try-catch블록과 매우 유사합니다.

try...except블록에는 2 개의 기본 블록과 2 개의 선택적 블록이 있습니다.

  • try(필수)-예외가 트리거 될 수있는 코드 블록을 캡슐화하는 기본 블록입니다. try블록은 예외가 트리거 될 때마다 그 안의 전체 프로세스를 중지합니다.
  • except(필수)-지정된 예외가 트리거 될 때마다 블록 프로그램이 진행됩니다. 이 블록은 일반적으로 호출자에 대한 설명 오류 메시지 또는 단순한print()문을 포함합니다. 단일try블록에 둘 이상의except블록이있을 수 있으며 각 블록은 서로 다른 예외를 포착합니다.
  • else(선택 사항)-이 선택적 블록은try블록이 예외를 트리거하지 않은 경우 프로그램이 진행되는 곳입니다.
  • finally(선택 사항)-이 선택적 블록은 예외가 트리거되었는지 여부에 관계없이 이전 3 개 블록의 모든 것이 수행되면 실행됩니다.

DemoException클래스를 사용하는 이전 예제를 사용하여 간단한try...except블록을 시도해 보겠습니다.

먼저 함수에서raise키워드를 래핑하고try...except블록 안에 넣습니다.

이 예제를 위해 생성 할 함수는 숫자를 받아들이고0을 전송하면 예외를 발생시키는 함수입니다. 다른 번호를 보내면 코드가 의도 한대로 진행됩니다. 아래 예를 확인하십시오.

class DemoException(Exception):
    def __init__(self, message):
        super().__init__(message)


message = "Exception Triggered! Something went wrong."


def triggerException(num):
    if num == 0:
        raise DemoException(message)
    else:
        print(num)


try:
    triggerException(0)
    print("Code has successfully been executed.")
except DemoException:
    print("Error: Number should not be 0.")

triggerException()이 인수로0을 전달 했으므로 코드는DemoException을 트리거해야합니다. 여기서raise키워드 메시지가 출력으로except블록 내부에있는 모든 것으로 대체 될 것으로 예상해야합니다.

triggerException()함수 호출 후print()행이 출력되지 않았습니다. 함수에서 예외가 발생했기 때문입니다. 따라서try블록 내의 모든 프로세스를 즉시 중지하고except블록으로 직접 진행했습니다.

출력:

Error: Number should not be 0.

이제 예를 들어20과 같은 유효한 숫자를 전달해 보겠습니다.

try:
    triggerException(20)
    print("Code has successfully been executed.")
except DemoException:
    print("Error: Number should not be 0.")

출력:

20
Code has successfully been executed.

except블록을 연결하고 또 다른 예외를 생성 해 보겠습니다. 주어진 입력이 숫자가 아닌 경우 트리거되는 새 예외NumberFormatException을 호출 해 보겠습니다. 이 예외 클래스의 경우 클래스 내부에 메시지를 선언 해 보겠습니다.

class NumberFormatException(Exception, value):
    message = f"{value} is not a number"

    def __init__(self):
        super().__init__(message)

이제 새 예외 클래스NumberFormatException을 처리하도록 위 코드를 수정합니다.

class DemoException(Exception):
    def __init__(self, message):
        super().__init__(message)


class NumberFormatException(Exception):
    def __init__(self, message, value):
        message = f"{value} is not a number"
        super().__init__(message)


message = "Exception occured."


def triggerException(num):
    if not num.isdigit():
        raise NumberFormatException(message, num)
    elif num == 0:
        raise DemoException(message)
    else:
        print(num)


num = "sample string"
try:
    triggerException(num)
    print("Code has successfully been executed.")
except DemoException:
    print("Error: Number should not be 0.")
except NumberFormatException:
    print(num + " is not a number.")

이 코드에서triggerException()에 전달 된num의 값은'sample string'문자열이므로NumberFormatException이 트리거되어야합니다.

출력:

sample string is not a number.

요약하면 Python에서 사용자 지정 예외를 만드는 것은 새 클래스를 만드는 것만 큼 간단하지만 클래스 정의에서Exception클래스를 추가 인수로 사용합니다. raise키워드는 주어진 예외 클래스에서 예외를 트리거하는 데 사용됩니다. try...except블록은 코드 블록 내에서 하나 이상의 예외를 래핑하고 프로그램을 완전히 종료하는 것이 아니라 해당 예외를 처리 할 때 코드가 수행하는 작업을 수정하는 데 사용됩니다.

Rayven Esplanada avatar Rayven Esplanada avatar

Skilled in Python, Java, Spring Boot, AngularJS, and Agile Methodologies. Strong engineering professional with a passion for development and always seeking opportunities for personal and career growth. A Technical Writer writing about comprehensive how-to articles, environment set-ups, and technical walkthroughs. Specializes in writing Python, Java, Spring, and SQL articles.

LinkedIn

관련 문장 - Python Exception