Python 의 오류 및 예외 처리

PythonBeginner
지금 연습하기

소개

본 실습에서는 Python 의 오류 (errors) 와 예외 (exceptions) 에 대한 실질적인 이해를 높일 것입니다. 코드 실행을 방해하는 일반적인 구문 오류 (syntax errors) 를 식별하는 방법, 런타임 중에 발생하는 다양한 유형의 예외를 인식하는 방법, 그리고 Python 프로그래밍에서 이 두 가지 근본적인 개념을 명확하게 구분하는 방법을 탐구할 것입니다.

실습을 통해 잘못된 들여쓰기 (indentation), 누락된 구문 요소 및 기타 일반적인 함정과 같은 문제를 찾아 수정하는 방법을 학습하여, 견고하고 오류 없는 Python 코드를 작성하기 위한 견고한 기반을 구축하게 될 것입니다.

이것은 가이드 실험입니다. 학습과 실습을 돕기 위한 단계별 지침을 제공합니다.각 단계를 완료하고 실무 경험을 쌓기 위해 지침을 주의 깊게 따르세요. 과거 데이터에 따르면, 이것은 초급 레벨의 실험이며 완료율은 100%입니다.학습자들로부터 100%의 긍정적인 리뷰율을 받았습니다.

구문 오류 식별하기

이 단계에서는 Python 의 일반적인 구문 오류 (syntax errors) 를 살펴봅니다. 구문 오류는 코드가 언어의 문법 규칙을 위반할 때 발생하며, 인터프리터가 코드를 이해하고 실행하는 것을 방해합니다. 이러한 오류는 프로그램이 실행을 시작하기도 전에 감지됩니다.

필요한 파일 syntax_errors.py~/project 디렉토리에 이미 생성되어 있습니다.

먼저, IndentationError를 소개하겠습니다. WebIDE 왼쪽의 파일 탐색기에서 syntax_errors.py를 엽니다. 잘못된 들여쓰기가 포함된 다음 코드를 추가합니다.

for i in range(5):
    print(i)
  print("This line has incorrect indentation")

파일을 저장합니다. 이제 통합 터미널을 열고 스크립트를 실행합니다.

python syntax_errors.py

IndentationError가 표시될 것입니다. Python 인터프리터는 코드 블록 (예: for 루프 내부의 블록) 이 일관된 들여쓰기 수준을 갖도록 요구합니다.

  File "/home/labex/project/syntax_errors.py", line 3
    print("This line has incorrect indentation")
                                                ^
IndentationError: unindent does not match any outer indentation level

이제 들여쓰기를 수정하고 다른 SyntaxError를 발생시켜 보겠습니다. syntax_errors.py의 코드를 다음으로 수정합니다. 첫 번째 줄 끝에 콜론 (:) 이 누락된 것을 확인하십시오.

for i in range(5)
    print(i)
    print("This line has correct indentation")

파일을 저장하고 터미널에서 다시 실행합니다.

python syntax_errors.py

이번에는 SyntaxError가 발생합니다. Python 의 for 루프 문은 코드 블록의 시작을 나타내기 위해 끝에 콜론이 필요합니다.

  File "/home/labex/project/syntax_errors.py", line 1
    for i in range(5)
                     ^
SyntaxError: expected ':'

마지막으로, 콜론을 수정하지만 또 다른 일반적인 SyntaxError, 즉 종료되지 않은 문자열 (unterminated string) 을 발생시켜 보겠습니다. syntax_errors.py 파일을 다음과 같이 수정합니다. 문자열 "hello'는 큰따옴표로 시작하지만 작은따옴표로 끝납니다.

for i in range(5):
    print("hello')

파일을 저장하고 실행합니다.

python syntax_errors.py

문자열이 일치하는 따옴표로 올바르게 닫히지 않았기 때문에 SyntaxError가 발생합니다.

  File "/home/labex/project/syntax_errors.py", line 2
    print("hello')
          ^
SyntaxError: unterminated string literal (detected at line 2)

이러한 예는 구문 오류가 프로그램이 실행되기 전에 수정되어야 함을 보여줍니다. 항상 들여쓰기, 콜론과 같은 필수 기호, 그리고 일치하는 따옴표에 세심한 주의를 기울이십시오.

일반적인 예외 인식하기

이 단계에서는 일반적인 예외 (exceptions) 를 살펴봅니다. 구문 오류와 달리 예외는 프로그램 실행 중에 발생합니다. 코드는 구문적으로는 올바르지만, 실행되는 동안 오류가 발생하는 경우입니다.

파일 common_exceptions.py~/project 디렉토리에 준비되어 있습니다.

먼저, ZeroDivisionError를 발생시켜 보겠습니다. 편집기에서 common_exceptions.py를 열고 다음 코드를 추가합니다.

numerator = 10
denominator = 0
result = numerator / denominator
print(result)

파일을 저장하고 터미널에서 실행합니다.

python common_exceptions.py

프로그램이 실행을 시작하지만 중단되고 ZeroDivisionError가 표시됩니다. 수학적으로 0 으로 나누는 것은 정의되지 않으며, Python 은 이 문제를 나타내기 위해 이 예외를 발생시킵니다.

Traceback (most recent call last):
  File "/home/labex/project/common_exceptions.py", line 3, in <module>
    result = numerator / denominator
ZeroDivisionError: division by zero

다음으로, NameError를 유발해 보겠습니다. 이는 아직 정의되지 않은 변수를 사용하려고 할 때 발생합니다. common_exceptions.py의 내용을 다음으로 바꿉니다.

print(undefined_variable)

파일을 저장하고 실행합니다.

python common_exceptions.py

인터프리터가 undefined_variable이 무엇을 참조하는지 모르기 때문에 NameError가 발생합니다.

Traceback (most recent call last):
  File "/home/labex/project/common_exceptions.py", line 1, in <module>
    print(undefined_variable)
NameError: name 'undefined_variable' is not defined

이제 TypeError를 살펴보겠습니다. 이는 부적절한 유형의 객체에 대해 연산을 시도할 때 발생합니다. common_exceptions.py의 내용을 이 코드로 바꿉니다.

print("Hello" + 5)

스크립트를 저장하고 실행합니다.

python common_exceptions.py

TypeError가 표시됩니다. Python 은 문자열과 정수를 직접 더하는 (+) 것을 허용하지 않습니다.

Traceback (most recent call last):
  File "/home/labex/project/common_exceptions.py", line 1, in <module>
    print("Hello" + 5)
TypeError: can only concatenate str (not "int") to str

마지막으로, IndexError를 시연해 보겠습니다. 이는 시퀀스 (예: 리스트) 의 요소를 범위를 벗어난 인덱스를 사용하여 액세스하려고 할 때 발생합니다. common_exceptions.py의 내용을 다음으로 바꿉니다.

my_list = [1, 2, 3]
print(my_list[5])

스크립트를 저장하고 실행합니다.

python common_exceptions.py

IndexError가 발생합니다. 리스트 my_list에는 세 개의 항목이 있으므로 유효한 인덱스는 0, 1, 2 입니다. 인덱스 5 에 액세스하는 것은 불가능합니다.

Traceback (most recent call last):
  File "/home/labex/project/common_exceptions.py", line 2, in <module>
    print(my_list[5])
IndexError: list index out of range

이러한 일반적인 예외를 이해하는 것은 Python 코드 디버깅을 배우는 핵심적인 부분입니다.

오류와 예외 구분하기

마지막 단계에서는 구문 오류 (syntax errors) 와 예외 (exceptions) 를 명확하게 구별해 보겠습니다. 이 구분은 Python 프로그래밍과 디버깅에 있어 근본적입니다.

구문 오류 (또는 파싱 오류, Parsing Errors):

  • 이는 Python 의 규칙을 위반하는 코드 구조상의 실수입니다.
  • Python 인터프리터는 프로그램이 실행을 시작하기 전에 이러한 오류를 발견합니다.
  • 구문 오류가 있는 프로그램은 전혀 실행될 수 없습니다.
  • 예시: IndentationError, 콜론 누락, 괄호 또는 따옴표 불일치.

예외 (또는 런타임 오류, Runtime Errors):

  • 이는 구문적으로 올바른 프로그램이 실행되는 동안 발생하는 오류입니다.
  • 0 으로 나누거나 존재하지 않는 파일에 액세스하는 등 프로그램이 예상치 못한 상황에 직면했을 때 발생합니다.
  • 처리되지 않으면 예외는 프로그램 충돌을 일으키고 트레이스백 (traceback) 을 출력합니다.
  • 예시: ZeroDivisionError, NameError, TypeError, IndexError.

이를 실제로 확인해 보겠습니다. 파일 탐색기에서 error_vs_exception.py 파일을 엽니다. 구문 오류 (콜론 누락) 와 런타임 예외를 유발할 줄을 모두 포함하는 다음 코드를 추가합니다.

## This line has a syntax error (missing colon)
for i in range(5)
    print(i)

## This line will cause an exception (division by zero)
result = 10 / 0
print(result)

파일을 저장하고 실행해 봅니다.

python error_vs_exception.py

즉시 SyntaxError가 발생하는 것을 확인할 수 있습니다. 인터프리터는 코드의 일부를 실행하기 전에 전체 파일의 구문이 올바른지 확인합니다. 누락된 콜론을 발견하고 중단하며, 10 / 0이 있는 줄에는 도달하지도 않습니다.

  File "/home/labex/project/error_vs_exception.py", line 2
    for i in range(5)
                     ^
SyntaxError: expected ':'

이제 구문 오류를 수정해 보겠습니다. error_vs_exception.py에서 for 루프 줄에 누락된 콜론을 추가합니다.

## The syntax error is now fixed
for i in range(5):
    print(i)

## This line will cause an exception (division by zero)
result = 10 / 0
print(result)

파일을 저장하고 다시 실행합니다.

python error_vs_exception.py

이번에는 프로그램이 구문적으로 올바르므로 실행을 시작합니다. for 루프가 실행되어 0 부터 4 까지의 숫자를 출력합니다. 그런 다음 프로그램이 result = 10 / 0을 실행하려고 할 때 런타임 문제를 만나 ZeroDivisionError를 발생시키고 프로그램이 충돌하게 됩니다.

0
1
2
3
4
Traceback (most recent call last):
  File "/home/labex/project/error_vs_exception.py", line 6, in <module>
    result = 10 / 0
ZeroDivisionError: division by zero

이는 구문 오류가 실행을 방해하는 반면, 예외는 실행 중에 발생한다는 것을 명확하게 보여줍니다. 다음 실습에서는 예외가 프로그램을 충돌시키지 않도록 예외를 우아하게 처리하는 방법을 배우게 될 것입니다.

요약

본 실습에서는 Python 에서 오류 (errors) 와 예외 (exceptions) 의 근본적인 차이점을 학습했습니다. 먼저, 프로그램 실행 자체를 막는 일반적인 구문 오류 (예: IndentationError 및 콜론 누락으로 인한 SyntaxError) 를 식별하고 수정하는 것부터 시작했습니다.

다음으로, ZeroDivisionError, NameError, TypeError, IndexError를 포함한 여러 일반적인 런타임 예외를 탐구했습니다. 구문적으로 올바른 코드 내에서 실행 중 연산이 실패할 때 이러한 예외가 어떻게 발생하는지 확인했습니다. 마지막으로, Python 인터프리터가 구문 오류와 잠재적 예외를 모두 포함하는 파일을 어떻게 처리하는지 관찰함으로써 이해를 공고히 했으며, 이는 실행이 시작되기 전에 구문 검사가 이루어진다는 것을 입증합니다. 이 지식은 Python 애플리케이션을 작성하고 디버깅하는 데 필수적인 기초를 제공합니다.