Python 에서 특정 예외 발생 여부 확인 방법

PythonBeginner
지금 연습하기

소개

이 랩에서는 Python 에서 특정 예외가 발생했는지 확인하는 방법을 배우게 됩니다. 이 랩은 다양한 예외 유형을 이해하고 효과적으로 처리하는 데 중점을 둡니다.

Python 스크립트의 실용적인 예제를 통해 TypeError, NameError, IndexError, KeyError, ValueError, FileNotFoundError와 같은 일반적인 예외 유형을 탐구할 것입니다. 이 랩은 exceptions_demo.py 파일을 만들고 각 예외 유형이 try...except 블록을 사용하여 어떻게 발생하고 잡히는지 보여주는 코드를 추가하는 과정을 안내합니다.

예외 유형 알아보기

이 단계에서는 Python 의 다양한 예외 유형에 대해 배우게 됩니다. 예외는 프로그램 실행의 정상적인 흐름을 방해하는 이벤트입니다. 예외 유형을 이해하는 것은 오류를 효과적으로 처리하는 데 매우 중요합니다.

Python 에는 많은 내장 예외가 있으며, 직접 만들 수도 있습니다. 다음은 몇 가지 일반적인 예외 유형입니다.

  • TypeError: 부적절한 유형의 객체에 연산 또는 함수가 적용될 때 발생합니다.
  • NameError: 로컬 또는 전역 네임스페이스에서 이름을 찾을 수 없을 때 발생합니다.
  • IndexError: 시퀀스 첨자가 범위를 벗어날 때 발생합니다.
  • KeyError: 딕셔너리 키를 찾을 수 없을 때 발생합니다.
  • ValueError: 연산 또는 함수가 올바른 유형이지만 부적절한 값을 가진 인수를 수신할 때 발생합니다.
  • FileNotFoundError: 파일 또는 디렉토리를 요청했지만 찾을 수 없을 때 발생합니다.

몇 가지 예제를 통해 이러한 예외 유형을 살펴보겠습니다. VS Code 편집기를 사용하여 ~/project 디렉토리에 exceptions_demo.py라는 Python 스크립트를 만들 것입니다.

  1. VS Code 를 엽니다.
  2. ~/project 디렉토리에 exceptions_demo.py라는 새 파일을 만듭니다.
  3. 다음 코드를 exceptions_demo.py 파일에 추가합니다.
## TypeError
try:
    result = 1 + "a"
except TypeError as e:
    print(f"TypeError: {e}")

## NameError
try:
    print(undefined_variable)
except NameError as e:
    print(f"NameError: {e}")

## IndexError
try:
    my_list = [1, 2, 3]
    print(my_list[5])
except IndexError as e:
    print(f"IndexError: {e}")

## KeyError
try:
    my_dict = {"a": 1, "b": 2}
    print(my_dict["c"])
except KeyError as e:
    print(f"KeyError: {e}")

## ValueError
try:
    num = int("abc")
except ValueError as e:
    print(f"ValueError: {e}")

## FileNotFoundError
try:
    with open("nonexistent_file.txt", "r") as f:
        content = f.read()
except FileNotFoundError as e:
    print(f"FileNotFoundError: {e}")

이 스크립트는 try...except 블록을 사용하여 다양한 예외 유형이 어떻게 발생하고 잡히는지 보여줍니다. 각 try 블록에는 특정 예외를 발생시킬 수 있는 코드가 포함되어 있습니다. 예외가 발생하면 해당 except 블록이 실행됩니다.

이제 스크립트를 실행해 보겠습니다.

  1. VS Code 에서 터미널을 엽니다.
  2. ~/project 디렉토리로 이동합니다.
cd ~/project
  1. python 명령을 사용하여 exceptions_demo.py 스크립트를 실행합니다.
python exceptions_demo.py

다음 출력을 볼 수 있습니다.

TypeError: unsupported operand type(s) for +: 'int' and 'str'
NameError: name 'undefined_variable' is not defined
IndexError: list index out of range
KeyError: 'c'
ValueError: invalid literal for int() with base 10: 'abc'
FileNotFoundError: [Errno 2] No such file or directory: 'nonexistent_file.txt'

이 출력은 각 try 블록이 예상된 예외를 발생시키고 해당 except 블록이 예외 메시지를 잡아서 출력했음을 보여줍니다.

다양한 예외 유형과 이를 처리하는 방법을 이해하는 것은 견고하고 신뢰할 수 있는 Python 코드를 작성하는 데 필수적입니다. 다음 단계에서는 특정 예외를 잡고 적절하게 처리하는 방법을 배우게 됩니다.

특정 예외 잡기

이전 단계에서는 Python 의 다양한 예외 유형에 대해 배웠습니다. 이제 try...except 블록을 사용하여 특정 예외를 잡는 방법을 배우게 됩니다. 이를 통해 다양한 오류를 다른 방식으로 처리하여 코드를 더욱 강력하게 만들 수 있습니다.

예외를 잡을 때는 가능한 한 구체적으로 하는 것이 가장 좋습니다. 이렇게 하면 except 블록이 처리하도록 설계되지 않은 예외를 실수로 잡는 것을 방지하여 오류를 숨기고 디버깅을 더 어렵게 만들 수 있습니다.

문자열을 정수로 변환하려고 할 때 ValueError와 같은 특정 예외를 잡도록 exceptions_demo.py 스크립트를 수정해 보겠습니다.

  1. VS Code 를 사용하여 ~/project 디렉토리에서 exceptions_demo.py 파일을 엽니다.
  2. 문자열을 정수로 변환할 때 ValueError만 잡도록 스크립트를 수정합니다.
try:
    num = int("abc")
except ValueError as e:
    print(f"ValueError caught: {e}")
except Exception as e:
    print(f"Some other exception: {e}")

print("Continuing execution...")

이 예제에서는 int("abc")가 실패할 때 발생하는 ValueError를 구체적으로 잡습니다. try 블록 내에서 다른 예외가 발생하면 except Exception as e: 블록에서 잡힙니다. print("Continuing execution...") 문은 예외가 잡히면 항상 실행되어 예외를 처리한 후에도 프로그램이 계속 실행됨을 보여줍니다.

이제 스크립트를 실행해 보겠습니다.

  1. VS Code 에서 터미널을 엽니다.
  2. ~/project 디렉토리로 이동합니다.
cd ~/project
  1. python 명령을 사용하여 exceptions_demo.py 스크립트를 실행합니다.
python exceptions_demo.py

다음 출력을 볼 수 있습니다.

ValueError caught: invalid literal for int() with base 10: 'abc'
Continuing execution...

이 출력은 ValueError가 잡혔고 프로그램이 계속 실행되었음을 보여줍니다.

이제 TypeError와 같은 다른 예외를 발생시키도록 스크립트를 수정하고 어떻게 처리되는지 살펴보겠습니다.

  1. VS Code 를 사용하여 ~/project 디렉토리에서 exceptions_demo.py 파일을 엽니다.
  2. TypeError를 발생시키도록 스크립트를 수정합니다.
try:
    result = 1 + "a"
except ValueError as e:
    print(f"ValueError caught: {e}")
except Exception as e:
    print(f"Some other exception: {e}")

print("Continuing execution...")

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

python exceptions_demo.py

다음 출력을 볼 수 있습니다.

Some other exception: unsupported operand type(s) for +: 'int' and 'str'
Continuing execution...

이 출력은 TypeError가 특정 except TypeError 블록이 없기 때문에 except Exception as e: 블록에서 잡혔음을 보여줍니다.

특정 예외를 잡으면 다양한 오류를 다른 방식으로 처리하여 코드를 더욱 강력하게 만들고 디버깅을 더 쉽게 할 수 있습니다. 다음 단계에서는 예외 인스턴스를 확인하는 방법을 배우게 됩니다.

예외 인스턴스 확인

이 단계에서는 발생한 오류에 대한 자세한 정보를 얻기 위해 예외 인스턴스를 확인하는 방법을 배우게 됩니다. 예외를 잡으면 오류에 대한 세부 정보를 포함하는 예외 객체 자체에 액세스할 수 있습니다.

exceptions_demo.py 스크립트를 수정하여 예외 인스턴스의 유형과 인수를 출력해 보겠습니다.

  1. VS Code 를 사용하여 ~/project 디렉토리에서 exceptions_demo.py 파일을 엽니다.
  2. ValueError 예외의 유형과 인수를 출력하도록 스크립트를 수정합니다.
try:
    num = int("abc")
except ValueError as e:
    print(f"Exception type: {type(e)}")
    print(f"Exception arguments: {e.args}")
    print(f"ValueError caught: {e}")
except Exception as e:
    print(f"Some other exception: {e}")

print("Continuing execution...")

이 예제에서는 type(e)를 사용하여 예외 객체의 유형을 출력하고 e.args를 사용하여 예외의 인수를 출력합니다. e.args 속성은 예외의 생성자에 전달된 인수를 포함하는 튜플입니다.

이제 스크립트를 실행해 보겠습니다.

  1. VS Code 에서 터미널을 엽니다.
  2. ~/project 디렉토리로 이동합니다.
cd ~/project
  1. python 명령을 사용하여 exceptions_demo.py 스크립트를 실행합니다.
python exceptions_demo.py

다음 출력을 볼 수 있습니다.

Exception type: <class 'ValueError'>
Exception arguments: ("invalid literal for int() with base 10: 'abc'",)
ValueError caught: invalid literal for int() with base 10: 'abc'
Continuing execution...

이 출력은 예외 유형 (ValueError) 과 예외의 생성자에 전달된 인수 (오류 메시지를 포함하는 튜플) 를 보여줍니다.

이 정보를 사용하여 보다 자세한 오류 메시지를 제공하거나 예외의 유형 및 인수를 기반으로 특정 작업을 수행할 수 있습니다.

예를 들어, 예외 인수에 특정 오류 메시지가 포함되어 있는지 확인할 수 있습니다.

try:
    num = int("abc")
except ValueError as e:
    if "invalid literal" in e.args[0]:
        print("Invalid input: Please enter a valid number.")
    else:
        print(f"ValueError caught: {e}")
except Exception as e:
    print(f"Some other exception: {e}")

print("Continuing execution...")

이 예제에서는 ValueError 예외의 첫 번째 인수에 문자열 "invalid literal"이 포함되어 있는지 확인합니다. 포함되어 있으면 보다 구체적인 오류 메시지를 출력합니다.

예외 인스턴스를 확인하면 오류를 보다 지능적으로 처리하고 사용자에게 보다 유익한 오류 메시지를 제공할 수 있습니다.

요약

이 랩에서는 효과적인 오류 처리에 필수적인 Python 의 다양한 예외 유형을 이해하는 데 중점을 둡니다. 이 랩에서는 TypeError, NameError, IndexError, KeyError, ValueError, FileNotFoundError와 같은 일반적인 내장 예외를 소개합니다.

그런 다음 이 랩에서는 try...except 블록을 사용하여 이러한 예외가 어떻게 발생하고 잡히는지에 대한 실용적인 예제를 제공합니다. exceptions_demo.py라는 Python 스크립트를 생성하여 각 예외 유형을 시연하고, 프로그램 실행의 정상적인 흐름을 방해할 수 있는 잠재적인 오류를 예상하고 처리하는 방법을 보여줍니다.