12. 예외 처리
프로그램을 실행하는 동안 오류가 발생할 수 있으며, 이러한 오류로 인해 프로그램이 중단될 수 있습니다. 파이썬에서는 예외 처리를 통해 오류가 발생해도 프로그램이 정상적으로 작동하도록 할 수 있습니다. 이 장에서는 예외를 처리하는 방법과 주요 예외 처리 구문을 배워보겠습니다.
12.1 예외란 무엇인가?
예외(Exception)는 프로그램 실행 중에 발생하는 오류 상황을 의미합니다. 예를 들어, 숫자를 0으로 나누거나 존재하지 않는 파일을 열 때 예외가 발생할 수 있습니다. 이러한 예외를 처리하지 않으면 프로그램이 강제로 종료됩니다.
# 예외가 발생하는 코드 예제
def divide(a, b):
return a / b
print(divide(10, 0)) # ZeroDivisionError: division by zero
위 코드에서 10
을 0
으로 나누려고 하면 ZeroDivisionError
가 발생하고, 프로그램이 중단됩니다.
12.2 try-except 구문
예외가 발생할 가능성이 있는 코드를 try
블록에 작성하고, 예외가 발생했을 때 처리할 코드를 except
블록에 작성합니다. 이를 통해 프로그램이 예외 상황에서도 정상적으로 작동할 수 있도록 합니다.
# try-except 구문 예제
def divide(a, b):
try:
return a / b
except ZeroDivisionError:
return "0으로 나눌 수 없습니다."
print(divide(10, 0)) # 0으로 나눌 수 없습니다.
위 코드에서 try
블록 안에서 ZeroDivisionError
가 발생하면 except
블록에서 해당 예외를 처리합니다.
12.3 여러 예외 처리하기
except
블록을 여러 개 사용하여 서로 다른 예외를 처리할 수 있습니다.
# 여러 예외 처리 예제
def divide(a, b):
try:
return a / b
except ZeroDivisionError:
return "0으로 나눌 수 없습니다."
except TypeError:
return "숫자만 입력해야 합니다."
print(divide(10, "5")) # 숫자만 입력해야 합니다.
위 코드에서 TypeError
예외도 처리하여 숫자가 아닌 값을 전달했을 때의 상황을 처리합니다.
12.4 모든 예외 처리하기
모든 예외를 처리하고자 할 때는 Exception
클래스를 사용합니다. 하지만 이렇게 모든 예외를 처리하는 것은 문제의 원인을 파악하기 어렵게 만들 수 있으므로 신중하게 사용해야 합니다.
# 모든 예외 처리 예제
def divide(a, b):
try:
return a / b
except Exception as e:
return f"예외가 발생했습니다: {e}"
print(divide(10, 0)) # 예외가 발생했습니다: division by zero
12.5 else와 finally 구문
else
: 예외가 발생하지 않았을 때 실행되는 코드 블록입니다.finally
: 예외 발생 여부와 상관없이 항상 실행되는 코드 블록으로, 주로 자원을 정리할 때 사용됩니다.
# else와 finally 구문 예제
def divide(a, b):
try:
result = a / b
except ZeroDivisionError:
return "0으로 나눌 수 없습니다."
else:
return f"결과: {result}"
finally:
print("계산이 완료되었습니다.")
print(divide(10, 2)) # 결과: 5.0
print(divide(10, 0)) # 0으로 나눌 수 없습니다.
위 코드에서 finally
블록은 예외 발생 여부와 관계없이 항상 실행되므로, 자원 해제 작업 등에 유용합니다.
12.6 사용자 정의 예외
필요에 따라 사용자가 직접 예외를 정의하여 사용할 수 있습니다. 사용자 정의 예외는 기본적으로 Exception
클래스를 상속받아 정의합니다.
# 사용자 정의 예외 예제
class NegativeNumberError(Exception):
pass
def square_root(x):
if x < 0:
raise NegativeNumberError("음수는 제곱근을 계산할 수 없습니다.")
return x ** 0.5
try:
print(square_root(-9))
except NegativeNumberError as e:
print(e)
출력 결과:
음수는 제곱근을 계산할 수 없습니다.
12.7 예제: 파일 읽기와 예외 처리
파일을 읽을 때 발생할 수 있는 예외를 처리하는 예제를 작성해 보겠습니다.
# 파일 읽기와 예외 처리 예제
try:
with open("non_existent_file.txt", "r") as file:
content = file.read()
print(content)
except FileNotFoundError:
print("파일을 찾을 수 없습니다.")
출력 결과:
파일을 찾을 수 없습니다.
12.8 요약
- 예외는 프로그램 실행 중에 발생할 수 있는 오류 상황을 의미합니다.
try-except
구문을 사용하여 예외를 처리하고, 프로그램이 중단되지 않도록 할 수 있습니다.else
와finally
구문을 사용하여 예외 발생 여부에 따라 추가적인 처리를 할 수 있습니다.- 사용자 정의 예외를 만들어 특정 상황에 대한 예외를 처리할 수 있습니다.
이제 예외 처리를 통해 프로그램의 안정성을 높이고, 오류 상황에서도 안전하게 동작하도록 만들 수 있게 되었습니다. 다음 장에서는 간단한 프로젝트를 통해 배운 내용을 종합적으로 활용해 보겠습니다.