예외는 프로그램 실행 도중 예상치 못한 상황에서 발생하는 오류를 뜻한다.
예를 들어, 0으로 나누려고 하거나, 존재하지 않는 파일을 열려고 시도하는 경우가 해당된다.
파이썬에서 예외를 처리할 때 가장 기본적으로 사용하는 try-except 구문
try:
# 예외가 발생할 가능성이 있는 코드
x = 10 / 0
print("이 코드는 실행되지 않는다.")
except ZeroDivisionError:
# 예외 발생 시 실행할 코드
print("0으로 나눌 수 없다.")
여러개의 except를 사용할 경우 아래와 같이 작성가능
try:
user_input = input("숫자를 입력해 달라: ")
num = int(user_input)
result = 100 / num
print(f"결과: {result}")
except ValueError:
print("올바른 숫자를 입력해 달라.")
except ZeroDivisionError:
print("0으로 나눌 수 없다.")
try-except 구문에는 else 절을 추가로 사용가능. else는 예외가 발생하지 않았을 때만 실행됨.
try:
num = int(input("숫자를 입력해 달라: "))
except ValueError:
print("숫자가 아닌 값을 입력했다.")
else:
print(f"입력한 숫자는 {num}이다.")
위 예시에서 int(input()) 부분에서 예외(ValueError)가 발생하지 않으면 else 내부의 코드를 실행하고, 예외가 발생하면 except 블록만 실행됨.
finally 구문은 예외 발생 여부와 관계없이 항상 실행되는 블록. 예를 들어, 파일 입출력 시 파일을 정상적으로 닫는 작업을 finally에서 처리할 수 있음.
try:
f = open("some_file.txt", "r")
content = f.read()
print(content)
except FileNotFoundError:
print("파일을 찾을 수 없다.")
finally:
print("예외 발생 여부와 상관없이 실행되는 부분이다.")
f.close() # 파일을 열었다면 반드시 닫아야 한다.
위 코드에서는 파일이 존재하지 않아 예외가 발생해도, 혹은 정상적으로 파일을 읽었어도 finally 블록이 실행되어 파일을 닫음.
raise는 의도적으로 발생시키는 예외임.
프로그래머가 의도적으로 예외를 발생시킬 수 있음. 특정 상황에서 원하는 예외를 raise 키워드로 던져, 에러를 알리고 except 블록에서 처리하도록 할 수 있음.
def divide(a, b):
if b == 0:
raise ZeroDivisionError("0으로 나누려 했다.")
return a / b
try:
result = divide(10, 0)
except ZeroDivisionError as e:
print(e)
raise를 통해 원하는 예외 타입과 메시지를 명시할 수 있음. 함수 내부에서 에러 조건을 감지하면 바로 예외를 발생시켜 상위 코드에서 처리하게 만들 수 있음.
표준 라이브러리에서 제공하는 예외 타입 외에, 필요하다면 사용자가 직접 예외 클래스를 정의가능. 일반적으로 파이썬의 내장 Exception 클래스를 상속받아 구현.
class MyCustomError(Exception):
"""사용자 정의 예외 클래스"""
pass
def check_value(value):
if value < 0:
raise MyCustomError("값이 음수다!")
else:
print(f"값이 정상이다: {value}")
try:
check_value(-5)
except MyCustomError as e:
print("MyCustomError가 발생했다.")
print(e)
위 코드에서는 MyCustomError라는 새로운 예외 클래스를 만들고, 특정 조건(value < 0)에서 이를 발. 이렇게 정의한 예외는 except MyCustomError:와 같이 별도로 처리할 수 있음.
이제 기초문법 끝.