Python에서 여러 예외를 잡는 방법: 쉬운 가이드

파이썬에서 예외 처리는 프로그램의 안정성을 높이고, 사용자 경험을 향상시키는 중요한 방법입니다. 예외를 적절히 처리하면 프로그램 충돌을 방지할 수 있습니다. 이 글에서는 파이썬의 `try/except` 블록을 사용하여 여러 예외를 동시에 처리하는 방법에 대해 자세히 알아봅니다.

파이썬에서의 예외란 무엇인가?

파이썬에서 예외는 프로그램의 서로 다른 부분 간의 통신 방식입니다. 프로그램의 한 부분에서 처리할 수 없는 심각한 오류가 발생했다는 신호를 다른 부분으로 전달하는 역할을 합니다.

예외가 발생하면, 오류 처리 방법을 알고 있는 다른 코드 부분이 예외를 잡아 적절하게 처리합니다. 예외를 처리하지 않으면 프로그램이 중단될 수 있으므로, 예외 처리는 프로그램의 안정성을 높이는 데 필수적입니다.

이 글에서는 여러분이 파이썬 `try/except` 구문에 대한 기본적인 이해를 가지고 있다고 가정하고, 예외 처리의 심화된 내용을 다룹니다.

파이썬에서 여러 예외를 처리해야 하는 이유

  • 동일한 `except` 블록에서 여러 예외를 처리하면 코드 중복을 줄일 수 있습니다. 이는 코드의 가독성을 높이고, 수정 및 삭제를 용이하게 만듭니다.
  • 오류 유형을 여러 번 확인하는 대신 한 번만 확인하면 되므로 효율적인 코드 작성이 가능해집니다.

다중 예외 처리

다중 예외 처리란, 하나의 `except` 블록에서 여러 종류의 예외를 동시에 처리하는 상황을 의미합니다. 파이썬에서는 각 예외 유형에 대해 별도의 `except` 블록을 만들 수도 있지만, 유사하게 처리할 예외가 여러 개인 경우에는 하나의 블록에서 처리하는 것이 더 효율적입니다. 이 섹션에서는 예제를 통해 다중 예외 처리 방법을 살펴보겠습니다.

#1. 여러 `except` 블록으로 다양한 예외 처리하기

사용자로부터 두 개의 숫자를 입력받아 나눗셈을 수행하는 프로그램을 예로 들어보겠습니다. 이 프로그램에서는 사용자가 잘못된 값을 입력했을 때 발생할 수 있는 `ValueError`와 두 번째 숫자가 0일 때 발생하는 `ZeroDivisionError`를 처리해야 합니다. 두 경우 모두 “잘못된 값을 입력했습니다”라는 메시지를 출력하도록 합니다.

다음 코드는 이러한 요구 사항을 충족합니다.

  try:
      dividend = int(input('첫 번째 숫자를 입력하세요: '))
      divisor = int(input('두 번째 숫자를 입력하세요: '))
      quotient = dividend / divisor
      print(quotient)
  except ValueError as e:
      print("잘못된 값을 입력했습니다.")
  except ZeroDivisionError as e:
      print("잘못된 값을 입력했습니다.")
  except Exception as e:
      print("오류가 발생했습니다.")

위의 코드를 실행하고 숫자로 변환할 수 없는 문자열을 입력하면 다음과 같은 결과가 나타납니다.

두 번째 숫자로 0을 입력하면 다음과 같은 결과가 출력됩니다.

코드는 예상대로 작동하지만, `ValueError`와 `ZeroDivisionError`를 처리하는 코드가 중복되어 있다는 것을 알 수 있습니다. 프로그래밍에서는 DRY(Don’t Repeat Yourself) 원칙을 준수해야 하므로, 이는 이상적인 방식이 아닙니다.

따라서, 코드를 별도로 작성하는 대신, 여러 예외를 처리하는 하나의 `except` 블록으로 결합하여 코드 중복을 피할 수 있습니다.

#2. 하나의 `except` 블록에서 여러 예외 처리하기

여러 예외를 한 번에 처리하려면, `except` 구문에서 튜플 형태로 처리할 예외들을 명시합니다. 다음은 `ValueError`와 `ZeroDivisionError`를 하나의 `except` 블록에서 처리하는 예입니다.

  try:
      dividend = int(input('첫 번째 숫자를 입력하세요: '))
      divisor = int(input('두 번째 숫자를 입력하세요: '))
      quotient = dividend / divisor
      print(quotient)
  except (ValueError, ZeroDivisionError) as e:
      print("잘못된 값을 입력했습니다.")
  except Exception as e:
      print("오류가 발생했습니다.")

이전 코드보다 훨씬 간결하고 효율적인 구현입니다. 위의 코드는 이전과 동일하게 작동하며, 이전 예제를 사용하여 테스트해보면 이전과 같은 결과를 확인할 수 있습니다.

#3. 어떤 예외가 발생했는지 확인하기

위의 코드는 `ValueError` 또는 `ZeroDivisionError`가 발생했을 때, 동일한 `except` 블록을 실행합니다. 하지만, 경우에 따라서는 각 예외에 대해 다른 코드를 실행해야 할 수도 있습니다.

어떤 예외가 발생했는지 확인하려면, `except` 블록 내에서 `if/else` 문을 사용할 수 있습니다. 다음은 예시입니다.

  try:
      dividend = int(input('첫 번째 숫자를 입력하세요: '))
      divisor = int(input('두 번째 숫자를 입력하세요: '))
      quotient = dividend / divisor
      print(quotient)
  except (ValueError, ZeroDivisionError) as e:
      print("잘못된 값을 입력했습니다.")
      if isinstance(e, ValueError):
          print('값 오류')
      else:
          print('0으로 나누기 오류')
  except Exception as e:
      print("오류가 발생했습니다.")

이 코드는 `ValueError`와 `ZeroDivisionError`에 대한 일반적인 오류 메시지를 출력하는 것 외에도, 어떤 예외가 발생했는지 정확히 확인하고 추가 메시지를 출력합니다. 코드를 다시 실행해보면, 발생한 예외에 따라 추가 메시지가 출력되는 것을 확인할 수 있습니다.

언제 다중 예외 처리가 필요할까?

일반적으로, 여러 예외에 대해 동일한 코드를 실행해야 하는 경우에 다중 예외 처리가 유용합니다. 예를 들어 다음과 같은 경우가 있습니다.

  • 여러 원인으로 인해 실패할 수 있는 네트워크 요청. 서버에 연결할 수 없다는 사실을 사용자에게 알리는 것과 같이 동일한 방식으로 처리할 수 있습니다.
  • 여러 오류가 발생할 수 있는 데이터베이스 연결 실패. 이러한 오류들은 다르지만, 처리 방법은 동일할 수 있습니다.
  • 파일 입출력 작업에서 권한 오류, 디스크 공간 부족 오류 등과 같이 유사하게 처리할 수 있는 오류들.

결론

이 글에서는 여러 개의 `except` 블록을 하나로 결합하여 다중 예외를 처리하는 방법에 대해 살펴보았습니다. 다중 예외 처리를 통해 코드를 간결하고 읽기 쉽게 만들 수 있습니다. 다음으로는 파이썬 초보자를 위한 프로젝트 관련 글을 읽어보시길 추천합니다.