소개
이 랩에서는 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 스크립트를 만들 것입니다.
- VS Code 를 엽니다.
~/project디렉토리에exceptions_demo.py라는 새 파일을 만듭니다.- 다음 코드를
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 블록이 실행됩니다.
이제 스크립트를 실행해 보겠습니다.
- VS Code 에서 터미널을 엽니다.
~/project디렉토리로 이동합니다.
cd ~/project
- 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 스크립트를 수정해 보겠습니다.
- VS Code 를 사용하여
~/project디렉토리에서exceptions_demo.py파일을 엽니다. - 문자열을 정수로 변환할 때
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...") 문은 예외가 잡히면 항상 실행되어 예외를 처리한 후에도 프로그램이 계속 실행됨을 보여줍니다.
이제 스크립트를 실행해 보겠습니다.
- VS Code 에서 터미널을 엽니다.
~/project디렉토리로 이동합니다.
cd ~/project
- python 명령을 사용하여
exceptions_demo.py스크립트를 실행합니다.
python exceptions_demo.py
다음 출력을 볼 수 있습니다.
ValueError caught: invalid literal for int() with base 10: 'abc'
Continuing execution...
이 출력은 ValueError가 잡혔고 프로그램이 계속 실행되었음을 보여줍니다.
이제 TypeError와 같은 다른 예외를 발생시키도록 스크립트를 수정하고 어떻게 처리되는지 살펴보겠습니다.
- VS Code 를 사용하여
~/project디렉토리에서exceptions_demo.py파일을 엽니다. 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 스크립트를 수정하여 예외 인스턴스의 유형과 인수를 출력해 보겠습니다.
- VS Code 를 사용하여
~/project디렉토리에서exceptions_demo.py파일을 엽니다. 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 속성은 예외의 생성자에 전달된 인수를 포함하는 튜플입니다.
이제 스크립트를 실행해 보겠습니다.
- VS Code 에서 터미널을 엽니다.
~/project디렉토리로 이동합니다.
cd ~/project
- 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 스크립트를 생성하여 각 예외 유형을 시연하고, 프로그램 실행의 정상적인 흐름을 방해할 수 있는 잠재적인 오류를 예상하고 처리하는 방법을 보여줍니다.



