파이썬 - 예외 처리

안녕하세요, 파이썬을 꿈꾸는 여러분! 오늘은 파이썬에서 예외를 발생시키는 흥미로운 세계에 몸을 던지고 보겠습니다. 프로그래밍에 새로운 여러분이라면 걱정 마세요 – 저는 여러분을 단계별로 이 개념을 안내해 드릴 것입니다. 마치 저가 수년 동안 가르쳤던 수많은 학생들을 안내한 것처럼요. 그럼, 가장 좋아하는 음료수 한 잔을 들고 이 파이썬 모험에 함께 나가보세요!

Python - Raising Exceptions

파이썬에서 예외 발생

맛있는 음식을 만들고 있는 중에 갑자기 필수 재료가 없다는 것을 깨닫는다고 생각해 봅시다. 그때 어떻게 하죠? 아마도 요리를 멈추고 모두에게 문제가 발생했다고 알릴 거예요, right? 이것이 바로 파이썬에서 예외를 발생시키는 것과 같아요 – 코드에서 예상치 못한 상황이나 문제가 발생했다는 신호를 보내는 방법입니다.

왜 예외를 발생시키죠?

예외를 발생시키는 것은 다음과 같은 이유로 우리에게 도움이 됩니다:

  1. 오류나 이상한 상황을 나타내기
  2. 프로그램의 흐름을 제어하기
  3. 사용자나 코드의 다른 부분에 의미 있는 피드백을 제공하기

간단한 예제를 시작해 봅시다:

def divide(a, b):
if b == 0:
raise ValueError("0으로 나눌 수 없습니다!")
return a / b

try:
result = divide(10, 0)
except ValueError as e:
print(f"죄송합니다! 오류가 발생했습니다: {e}")

이 예제에서는 0으로 나눌 때 ValueError를 발생시킵니다. 자세히 설명해 봅시다:

  1. 우리는 divide(a, b) 함수를 정의하고 b가 0인지 확인합니다.
  2. b가 0이라면, 커스텀 메시지와 함께 ValueError를 발생시킵니다.
  3. 예외를 캐치하고 친절한 메시지를 출력하기 위해 try-except 블록을 사용합니다.

이 코드를 실행하면 다음과 같은 결과를 볼 수 있습니다:

죄송합니다! 오류가 발생했습니다: 0으로 나눌 수 없습니다!

내장 예외 발생

파이썬은 우리가 발생시킬 수 있는 다양한 내장 예외를 제공합니다. 몇 가지 일반적인 예외를 아래 표에 정리했습니다:

예외 이름 설명
ValueError 함수가 올바른 형식의 인수를 받았지만 적절하지 않은 값일 때 발생
TypeError 잘못된 형식의 객체에 연산이나 함수가 적용될 때 발생
IndexError 시퀀스 서브스크립트가 범위를 벗어날 때 발생
KeyError 딕셔너리에서 키를 찾지 못했을 때 발생
FileNotFoundError 요청한 파일이나 디렉토리가 존재하지 않을 때 발생

일부 예제를 살펴보겠습니다:

def check_age(age):
if not isinstance(age, int):
raise TypeError("나이는 정수여야 합니다")
if age < 0:
raise ValueError("나이는 음수일 수 없습니다")
print(f"당신의 나이는 {age}입니다")

try:
check_age("스물")
except TypeError as e:
print(f"형식 오류: {e}")

try:
check_age(-5)
except ValueError as e:
print(f"값 오류: {e}")

이 코드를 실행하면 다음과 같은 결과를 볼 수 있습니다:

형식 오류: 나이는 정수여야 합니다
값 오류: 나이는 음수일 수 없습니다

커스텀 예외 발생

때로는 내장 예외가 부족할 때가 있습니다. 이럴 때 우리는 자신만의 커스텀 예외를 만듭니다! 이는 요리사가 자신만의 독특한 레시피를 만드는 것과 같아요.

커스텀 예외 만들기

커스텀 예외를 만들기 위해, 우리는 단순히 Exception 클래스를 상속받는 새로운 클래스를 정의합니다:

class TooManyPizzasError(Exception):
pass

def order_pizza(number):
if number > 100:
raise TooManyPizzasError("와우! 그만큼 피자는 처리할 수 없어요!")
print(f"주문 확정: {number}개 피자")

try:
order_pizza(101)
except TooManyPizzasError as e:
print(f"주문 실패: {e}")

이 맛있는 예제에서:

  1. 우리는 커스텀 예외 TooManyPizzasError를 정의합니다.
  2. order_pizza 함수는 100개를 초과로 피자를 주문할 때 이 예외를 발생시킵니다.
  3. 우리는 예외를 캐치하고 친절한 메시지를 출력합니다.

이 코드를 실행하면 다음과 같은 결과를 볼 수 있습니다:

주문 실패: 와우! 그만큼 피자는 처리할 수 없어요!

예외 다시 발생

때로는 예외를 캐치한 후, 뭔가를 하고 다른 사람에게 다시 발생시키고 싶을 때가 있습니다. 이는 게임에서 뜨거운 감자를 넘기는 것과 같아요!

이렇게 하는 방법을 살펴보겠습니다:

def risky_operation():
print("위험한 작업을 시작합니다...")
raise ValueError("뭔가 잘못되었습니다!")

def perform_operation():
try:
risky_operation()
except ValueError:
print("오류를 캐치했습니다, 로깅 중...")
raise  # 예외를 다시 발생시킵니다

try:
perform_operation()
except ValueError as e:
print(f"작업 실패: {e}")

이 예제에서:

  1. risky_operation()는 항상 ValueError를 발생시킵니다.
  2. perform_operation()는 예외를 캐치하고 로그한 후 다시 발생시킵니다.
  3. 우리는 외부 try-except 블록에서 다시 발생된 예외를 캐치합니다.

이 코드를 실행하면 다음과 같은 결과를 볼 수 있습니다:

위험한 작업을 시작합니다...
오류를 캐치했습니다, 로깅 중...
작업 실패: 뭔가 잘못되었습니다!

그리고 이렇게 하면 모두! 우리는 예외 발생, 내장 예외, 커스텀 예외, 그리고 예외 다시 발생에 대해 다루었습니다. 기억해요, 예외는 여러분의 적이 아니라는 것을 – 강건하고 오류에 저항할 수 있는 코드를 작성하는 데 유용한 도구입니다.

항상 학생들에게 말씀드리는 것처럼, 코딩은 자전거를 타는 것과 같아요. 몇 번 넘어져도, 각 넘어짐(또는 예외)마다 새로운 것을 배울 수 있어요. 계속 연습하고, 호기심을 지켜요, 그리고 여러분의 코드에서 몇 가지 예외를 발생시켜 보세요!

코딩을 즐겁게, 여러분의 예외는 항상 의도적이길 바랍니다! ?✨

Credits: Image by storyset