Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

Python try-except로 예외 처리하기: 에러 핸들링 완벽 가이드

이 튜토리얼에서는 Python의 tryexcept에 대해 알아보겠습니다. Python에는 오류 및 예외 처리(error and exception handling)라는 개념이 있으며, 이때 tryexcept 키워드가 사용됩니다.

Python의 두 가지 오류 유형

Python에서는 기본적으로 두 가지 유형의 오류를 만나게 됩니다.

  • 구문 오류(Syntax errors) — Python이 프로그램 내 코드 라인을 이해하지 못할 때 발생하는 오류입니다.
  • 예외 오류(Exception errors) — 프로그램 실행 중(런타임)에 감지되는 오류입니다. 예: ZeroDivisionError, ValueError 등

구문 오류는 사전에 막을 수 없지만, try-except를 사용하면 프로그램이 예외 오류를 만났을 때 이를 처리하고 적절히 대응할 수 있습니다.

자주 발생하는 Python 예외 오류

Python에서 가장 흔하게 접하는 예외 오류들은 다음과 같습니다.

  • ZeroDivisionError — 숫자를 0으로 나누려고 할 때 발생합니다.
  • ValueError — 함수에 부적절한 값을 전달했을 때 발생합니다.
  • IndexError — 존재하지 않는 인덱스에 접근하려고 할 때 발생합니다.
  • KeyError — 딕셔너리에 없는 키에 접근하려고 할 때 발생합니다.
  • ImportError — 존재하지 않는 모듈을 임포트하려고 할 때 발생합니다.
  • IOError — Python이 파일을 열 수 없을 때 발생합니다.
  • KeyboardInterrupt — 사용자가 실행 중단 키(예: Ctrl+C)를 눌렀을 때 발생합니다.

Python에는 이 외에도 다양한 예외 오류가 있으며, try-except를 활용하면 손쉽게 처리할 수 있습니다.

try-except 기본 문법

# try-except 문법
try:
    # 실행할 코드
    # ...
except:
    # 예외 발생 시 실행할 코드
    # ...

try-except 블록의 동작 방식

Python이 try-except 블록을 실행하는 과정은 다음과 같습니다.

  • 먼저 Python은 try 블록 안의 코드를 실행합니다.
  • 코드에서 예외 오류가 발생하지 않으면, except 블록은 실행되지 않습니다.
  • 코드에서 예외 오류가 발생하면, try 블록의 나머지 코드는 건너뛰고 except 블록의 코드가 실행됩니다.
  • 예외 오류가 발생했는데 except 블록이 해당 오류를 처리하지 못하면, 해당 예외 오류가 그대로 발생(raise)합니다.
  • 하나의 try 블록에 여러 개의 except 문을 작성할 수도 있습니다.

예제 1: 예외가 발생하지 않는 경우

유효한 인덱스로 리스트 요소에 접근하는 예제입니다.

# 예외 오류 없음
try:
    arr = [1, 2, 3, 4, 5]
    # 유효한 인덱스로 배열 요소에 접근
    two = arr[1]
    print(f"오류 없이 정상 실행되었습니다 {two}")
except IndexError:
    print("유효하지 않은 인덱스입니다")

실행 결과

오류 없이 정상 실행되었습니다 2

예외 오류가 발생하지 않았기 때문에 try 블록의 코드가 그대로 실행되었습니다.

예제 2: 유효하지 않은 인덱스에 접근하는 경우

이번에는 존재하지 않는 인덱스에 접근해 보겠습니다.

# 잘못된 인덱스 접근
try:
    arr = [1, 2, 3, 4, 5]
    # 유효하지 않은 인덱스로 배열 요소에 접근
    six = arr[6]
    print(f"오류 없이 정상 실행되었습니다 {six}")
except IndexError:
    print("유효하지 않은 인덱스입니다")

실행 결과

유효하지 않은 인덱스입니다

try 블록에서 IndexError가 발생했기 때문에, except 블록의 코드가 대신 실행되었습니다.

예제 3: except가 예외를 처리하지 못하는 경우

만약 except 블록이 발생한 예외를 처리하지 못하면 어떻게 될까요?

# except가 예외를 처리하지 못하는 경우
try:
    arr = [1, 2, 3, 4, 5]
    # 유효하지 않은 인덱스로 배열 요소에 접근
    six = arr[6]
    print(f"오류 없이 정상 실행되었습니다 {six}")
except ValueError:
    print("유효하지 않은 인덱스입니다")

실행 결과

---------------------------------------------------------------------------
IndexError                                 Traceback (most recent call last)
<ipython-input-11-fe3737d0615b> in <module>
      3     arr = [1, 2, 3, 4, 5]
      4     # 유효하지 않은 인덱스로 배열 요소에 접근
----> 5     six = arr[6]
      6     print(f"오류 없이 정상 실행되었습니다 {six}")
      7 except ValueError:
IndexError: list index out of range

실제로 발생한 오류는 IndexError인데, except 블록에는 ValueError만 지정되어 있어 이를 처리하지 못했습니다. 그 결과 프로그램은 오류와 함께 중단됩니다. 따라서 except 블록에 예외 유형을 지정할 때는 실제로 발생할 수 있는 예외를 정확히 명시하는 것이 매우 중요합니다.

마무리

지금까지 Python의 try-except를 활용한 예외 처리 방법을 살펴보았습니다. 구문 오류는 코드 작성 단계에서 수정해야 하지만, 예외 오류는 try-except를 통해 프로그램이 비정상적으로 종료되지 않도록 우아하게 처리할 수 있습니다. 튜토리얼에 대해 궁금한 점이 있다면 댓글로 남겨주세요.