예외처리의 중요성과 기본 구조
프로그래밍에서 예외(Exception)는 프로그램 실행 중 발생할 수 있는 오류 상황을 말합니다.
예를 들어, 존재하지 않는 파일을 열거나 0으로 나누는 등의 작업이 예외를 발생시킵니다.
예외를 처리하지 않으면 프로그램은 중단되지만, try-except
문을 사용하면 에러를 잡고 프로그램을 계속 실행할 수 있습니다.
기본 예외처리 예제
try:
num = int(input("숫자를 입력하세요: "))
result = 10 / num
print("결과:", result)
except ZeroDivisionError:
print("0으로 나눌 수 없습니다.")
except ValueError:
print("숫자가 아닌 값이 입력되었습니다.")
해석:
try
블록 내부에서 예외가 발생하면except
블록이 실행됩니다.ZeroDivisionError
: 0으로 나누기를 했을 때 발생ValueError
: 정수가 아닌 문자열 등 입력 시 발생
이처럼 예외를 적절히 처리하면 사용자에게 친절한 메시지를 보여주고, 프로그램이 중단되지 않도록 만들 수 있습니다.
예외 클래스 만들기
기본 예외 클래스 외에도, 특정 상황에 맞는 예외를 직접 만들어 처리할 수 있습니다.
이런 방식은 프로그램의 가독성과 유지보수성을 크게 높여줍니다.
1. 사용자 정의 예외 기본 구조
class MyCustomError(Exception):
pass
raise MyCustomError("이건 사용자 정의 예외입니다.")
해석:Exception
클래스를 상속받아 나만의 예외 클래스를 정의합니다.raise
키워드는 특정 조건에서 강제로 예외를 발생시키는 데 사용합니다.
2. 예외 클래스에 메시지 전달하기
class AgeError(Exception):
def __init__(self, age):
self.age = age
def __str__(self):
return f"유효하지 않은 나이입니다: {self.age}세"
def check_age(age):
if age < 0:
raise AgeError(age)
try:
check_age(-5)
except AgeError as e:
print("예외 발생:", e)
해석:
__init__
: 예외 객체 생성 시 데이터를 받을 수 있게 해줍니다.__str__
: 예외 메시지를 출력할 때 사용자 정의 형식으로 보여줍니다.- 위 코드에서는 음수를 나이로 입력하면 예외가 발생하고, 사용자 정의 메시지가 출력됩니다.
3. 예외 클래스 상속 구조로 정리하기
class LoginError(Exception):
pass
class UserNotFound(LoginError):
def __str__(self):
return "해당 사용자를 찾을 수 없습니다."
class WrongPassword(LoginError):
def __str__(self):
return "비밀번호가 틀렸습니다."
def login(user_id, password):
if user_id != "admin":
raise UserNotFound()
if password != "1234":
raise WrongPassword()
print("로그인 성공!")
try:
login("guest", "0000")
except LoginError as e:
print("로그인 실패:", e)
해석:LoginError
를 상위 예외로 만들고, 그 아래 세부적인 예외들을 상속시켜 설계합니다.
이런 방식은 여러 종류의 예외를 하나의 범주로 묶고, 필요에 따라 분기처리할 수 있어 실무에서 매우 유용합니다.
예외처리 활용 방법
사용자 정의 예외는 주로 다음과 같은 상황에서 유용하게 쓰입니다:
- 입력값이 유효하지 않을 때 (예: 나이, 가격, 파일명)
- 로그인/인증/권한 검사 등 복잡한 조건 처리
- API 응답 오류 처리 시 상황 구분 필요할 때
1. 비밀번호 유효성 검사 예제
class PasswordTooShort(Exception):
def __init__(self, length):
self.length = length
def __str__(self):
return f"비밀번호가 너무 짧습니다. (현재: {self.length}자, 최소 8자 필요)"
def validate_password(pw):
if len(pw) < 8:
raise PasswordTooShort(len(pw))
print("비밀번호 통과!")
try:
validate_password("abc12")
except PasswordTooShort as e:
print("에러:", e)
해석:
이 예제는 비밀번호가 너무 짧을 경우 PasswordTooShort
예외를 발생시킵니다.
오류 메시지는 사용자에게 명확한 피드백을 줄 수 있도록 길이 정보도 포함합니다.
2. 조건별 예외 처리로 흐름 제어
사용자 정의 예외는 단순히 오류 메시지를 보여주는 것뿐만 아니라, 복잡한 조건에 따른 흐름 제어에도 매우 유용합니다.
예외를 통해 상황을 분리하면 코드가 깔끔해지고, 조건 분기보다 유지보수가 쉬워집니다.