Python 에서 예외 메시지 확인하는 방법

PythonBeginner
지금 연습하기

소개

이 랩에서는 Python 에서 예외 메시지를 탐색하고 접근하여 효과적으로 디버깅하고 오류를 처리하는 방법을 배우게 됩니다. 이 랩은 나눗셈 중에 발생할 수 있는 예외를 잡기 위해 try...except 블록을 사용하는 divide 함수가 있는 Python 스크립트를 생성하는 과정을 안내합니다. ZeroDivisionErrorTypeError와 같은 다양한 유형의 예외가 어떻게 특정 오류 메시지를 생성하는지 관찰하게 됩니다.

그런 다음, 이 랩에서는 오류에 대한 더 자세한 정보를 얻기 위해 예외 객체와 해당 유형에 접근하는 방법을 보여줍니다. 다양한 입력을 사용하여 스크립트를 실행함으로써 예외 메시지가 오류의 원인에 대한 귀중한 통찰력을 제공하여 코드의 문제를 식별하고 수정할 수 있게 해주는 것을 보게 될 것입니다.

예외 메시지 탐색

이 단계에서는 Python 에서 예외 메시지를 탐색하는 방법을 배우게 됩니다. 예외 메시지는 코드에서 무엇이 잘못되었는지에 대한 귀중한 정보를 제공하여 오류를 디버깅하고 수정하는 데 도움을 줍니다.

먼저, VS Code 편집기를 사용하여 ~/project 디렉토리에 exceptions.py라는 Python 파일을 생성해 보겠습니다.

## exceptions.py
def divide(x, y):
    try:
        result = x / y
        print("The result is:", result)
    except Exception as e:
        print("An error occurred:", e)

divide(10, 2)
divide(10, 0)
divide("hello", 5)

이 코드에서:

  • xy로 나누려고 시도하는 함수 divide(x, y)를 정의합니다.
  • 나눗셈 중에 발생할 수 있는 예외를 잡기 위해 try...except 블록을 사용합니다.
  • 예외가 발생하면 예외 객체 e와 함께 오류 메시지를 출력합니다.

이제 python 명령을 사용하여 exceptions.py 스크립트를 실행해 보겠습니다.

python exceptions.py

다음과 같은 출력을 볼 수 있습니다.

The result is: 5.0
An error occurred: division by zero
An error occurred: unsupported operand type(s) for /: 'str' and 'int'

보시다시피, divide(10, 2)에 대한 첫 번째 호출은 성공적으로 실행되고 결과를 출력합니다. 두 번째 호출인 divide(10, 0)division by zero 예외를 발생시키고, 이는 except 블록에 의해 잡혀 해당 오류 메시지가 출력됩니다. 세 번째 호출인 divide("hello", 5)는 문자열을 정수로 나눌 수 없기 때문에 TypeError를 발생시킵니다.

이제 exceptions.py 파일을 수정하여 예외의 유형을 출력해 보겠습니다.

## exceptions.py
def divide(x, y):
    try:
        result = x / y
        print("The result is:", result)
    except Exception as e:
        print("An error occurred:", type(e), e)

divide(10, 2)
divide(10, 0)
divide("hello", 5)

스크립트를 다시 실행합니다.

python exceptions.py

다음과 같은 출력을 볼 수 있습니다.

The result is: 5.0
An error occurred: <class 'ZeroDivisionError'> division by zero
An error occurred: <class 'TypeError'> unsupported operand type(s) for /: 'str' and 'int'

이 출력은 발생한 각 예외의 유형을 보여주어 디버깅을 위한 더 많은 정보를 제공합니다.

예외 args 접근

이 단계에서는 Python 에서 예외와 관련된 인수 (args) 에 접근하는 방법을 배우게 됩니다. 예외 인수는 발생한 오류에 대한 더 구체적인 세부 정보를 제공할 수 있습니다.

이전 단계에서 생성한 exceptions.py 파일을 수정하여 예외 인수에 접근하고 출력해 보겠습니다. VS Code 편집기를 사용하여 ~/project 디렉토리에서 exceptions.py를 엽니다.

## exceptions.py
def divide(x, y):
    try:
        result = x / y
        print("The result is:", result)
    except Exception as e:
        print("An error occurred:", type(e), e.args)

divide(10, 2)
divide(10, 0)
divide("hello", 5)

이 코드에서 except 블록을 수정하여 e.args를 출력하도록 했습니다. args 속성은 예외의 생성자에 전달된 인수를 포함하는 튜플입니다.

이제 exceptions.py 스크립트를 실행합니다.

python exceptions.py

다음과 같은 출력을 볼 수 있습니다.

The result is: 5.0
An error occurred: <class 'ZeroDivisionError'> ('division by zero',)
An error occurred: <class 'TypeError'> ("unsupported operand type(s) for /: 'str' and 'int'",)

보시다시피, 이제 출력에는 각 예외와 관련된 인수가 포함됩니다. ZeroDivisionError의 경우 인수는 문자열 'division by zero'를 포함하는 튜플입니다. TypeError의 경우 인수는 문자열 "unsupported operand type(s) for /: 'str' and 'int'"를 포함하는 튜플입니다.

exceptions.py 파일을 다시 수정하여 첫 번째 인수에 직접 접근해 보겠습니다.

## exceptions.py
def divide(x, y):
    try:
        result = x / y
        print("The result is:", result)
    except Exception as e:
        print("An error occurred:", type(e), e.args[0])

divide(10, 2)
divide(10, 0)
divide("hello", 5)

스크립트를 다시 실행합니다.

python exceptions.py

다음과 같은 출력을 볼 수 있습니다.

The result is: 5.0
An error occurred: <class 'ZeroDivisionError'> division by zero
An error occurred: <class 'TypeError'> unsupported operand type(s) for /: 'str' and 'int'

e.args[0]에 접근함으로써 예외의 첫 번째 인수를 추출할 수 있으며, 이는 종종 오류 메시지의 가장 설명적인 부분입니다.

메시지 문자열 일치

이 단계에서는 Python 에서 예외의 메시지 문자열을 일치시키는 방법을 배우게 됩니다. 이는 메시지에 따라 특정 유형의 예외를 다르게 처리하려는 경우에 유용합니다.

ZeroDivisionError를 특별히 잡고 사용자 지정 메시지를 출력하도록 작업해 온 exceptions.py 파일을 수정해 보겠습니다. VS Code 편집기를 사용하여 ~/project 디렉토리에서 exceptions.py를 엽니다.

## exceptions.py
def divide(x, y):
    try:
        result = x / y
        print("The result is:", result)
    except ZeroDivisionError as e:
        print("Cannot divide by zero!")
    except Exception as e:
        print("An error occurred:", type(e), e.args[0])

divide(10, 2)
divide(10, 0)
divide("hello", 5)

이 코드에서:

  • ZeroDivisionError에 대한 특정 except 블록을 추가했습니다.
  • ZeroDivisionError가 발생하면 "Cannot divide by zero!" 메시지를 출력합니다.
  • 일반적인 except Exception as e 블록은 다른 모든 예외를 잡습니다.

이제 exceptions.py 스크립트를 실행합니다.

python exceptions.py

다음과 같은 출력을 볼 수 있습니다.

The result is: 5.0
Cannot divide by zero!
An error occurred: <class 'TypeError'> unsupported operand type(s) for /: 'str' and 'int'

보시다시피, divide(10, 0)이 호출되면 ZeroDivisionError가 특정 except 블록에 의해 잡히고 사용자 지정 메시지 "Cannot divide by zero!"가 출력됩니다. divide("hello", 5)에 의해 발생한 TypeError는 여전히 일반적인 except 블록에 의해 잡힙니다.

특정 예외 유형을 잡는 것보다 일반적으로 권장되지는 않지만, 메시지 문자열을 직접 일치시킬 수도 있습니다. 방법은 다음과 같습니다.

## exceptions.py
def divide(x, y):
    try:
        result = x / y
        print("The result is:", result)
    except Exception as e:
        if "division by zero" in str(e):
            print("Cannot divide by zero!")
        else:
            print("An error occurred:", type(e), e.args[0])

divide(10, 2)
divide(10, 0)
divide("hello", 5)

이 코드에서:

  • 일반적인 except 블록에서 모든 예외를 잡습니다.
  • 문자열 "division by zero"가 예외 객체 e의 문자열 표현에 있는지 확인합니다.
  • 있는 경우 "Cannot divide by zero!"를 출력합니다. 그렇지 않으면 일반적인 오류 메시지를 출력합니다.

스크립트를 다시 실행합니다.

python exceptions.py

이전과 동일한 출력을 볼 수 있습니다.

The result is: 5.0
Cannot divide by zero!
An error occurred: <class 'TypeError'> unsupported operand type(s) for /: 'str' and 'int'

메시지 문자열을 일치시키는 것은 경우에 따라 유용할 수 있지만, 예외 메시지가 변경될 수 있으므로 특정 예외 유형을 잡는 것이 일반적으로 더 좋습니다. 이렇게 하면 코드가 덜 신뢰성이 떨어집니다.

요약

이 랩에서는 Python 에서 예외 메시지를 탐구하여 오류를 디버깅하고 수정하는 방법을 이해했습니다. try...except 블록을 사용하여 나눗셈 연산 중에 예외를 잡고 예외 객체 e를 출력하여 오류 메시지를 확인하는 방법을 배웠습니다.

또한 스크립트를 수정하여 예외 유형을 출력하여 ZeroDivisionErrorTypeError와 같은 발생한 오류의 특성에 대한 추가적인 통찰력을 얻었습니다. 이를 통해 보다 목표적인 디버깅 및 오류 처리가 가능합니다.