예외 처리(exception handling)
프로그램 실행 중 예상치 못한 오류(예외)가 발생했을 때, 이를 처리하고 프로그램이 완전히 멈추지 않도록 해주는 기법
예외를 처리하면, 오류가 발생해도 프로그램이 중단되지 않고 계속 동작하거나, 오류 상황을 좀 더 의미 있는 형태로 전달할 수 있음
----🐢
예외(exception)
프로그램 실행 중에 발생하는 오류 상황을 나타내는 객체
예외가 발생(raise)하면, 파이썬 인터프리터는 기본적으로 스택 트레이스(stack trace) 와 함께 프로그램을 중단
예외 처리를 통해 이러한 비정상 종료를 피하고, 적절하게 대응
---🐢-
오류 예외 처리 기법
파이썬의 예외 처리는 크게 try, except, else, finally 네 가지 키워드를 활용
try:
# 예외가 발생할 가능성이 있는 코드
except 예외타입1:
# 예외타입1이 발생했을 때 수행할 코드
except 예외타입2:
# 예외타입2가 발생했을 때 수행할 코드
else:
# 예외가 발생하지 않았을 때 수행할 코드
finally:
# 예외 발생 여부와 관계없이 항상 실행되는 코드
try-except문
try:
x = int(input("숫자를 입력하세요: ")) # ValueError 가능
result = 10 / x # ZeroDivisionError 가능
print(result)
except ValueError:
print("유효한 숫자가 아닙니다.")
except ZeroDivisionError:
print("0으로 나눌 수 없습니다.")
try 블록 안의 코드에서 ValueError 혹은 ZeroDivisionError가 발생하면, 해당하는 except 블록이 실행
발생한 예외의 종류가 어느 except 절과도 맞지 않으면, 프로그램이 다시 에러를 내고 종료
+ 하나의 except에서 여러 예외 타입을 처리하고 싶다면 괄호()로 묶어서 명시할 수 있음
try:
...
except (ValueError, ZeroDivisionError):
print("잘못된 값이거나, 0으로 나눌 수 없습니다.")
try-else문
try 블록에서 예외가 전혀 발생하지 않은 경우에만 else 블록이 실행
try:
x = int(input("숫자를 입력하세요: "))
except ValueError:
print("유효한 숫자가 아닙니다.")
else:
print(f"입력한 숫자는 {x} 입니다.")
만약 입력값이 올바른 숫자라면, else 문이 실행되어 "입력한 숫자는 x 입니다."를 출력
ValueError가 발생하면, except 블록이 실행되고 프로그램 흐름은 else 구문을 건너뜀
try-finally문
try 블록에서 예외가 발생하건 안 하건, 항상 마지막에 실행
try:
f = open("data.txt", "r")
content = f.read()
except FileNotFoundError:
print("파일이 존재하지 않습니다.")
else:
print("파일을 성공적으로 읽었습니다.")
finally:
f.close() # 파일이 있든 없든, 예외 발생 여부와 관계없이 실행
--🐢--
예외 객체 정보 활용
예외 객체를 받아서 오류 메시지나 추가 정보를 활용하고 싶다면, except 예외타입 as e: 사용
try:
a = [1, 2]
print(a[3])
4 / 0
except ZeroDivisionError as e:
print(e)
except IndexError as e:
print(e)
-🐢---
오류 회피하기 / 오류 일부러 발생시키기
오류 회피하기
try:
f = open("text.txt", 'r')
except FileNotFoundError:
pass # pass를 사용해 파일이 없더라도 오류가 발생하지 않고 통과
오류 일부러 발생시키기
raise 예외타입 or raise 예외타입("메시지")로 직접 예외 일으킴
class Bird:
def fly(self):
raise NotImplementedError
class Eagle(Bird):
pass
eagle = Eagle()
eagle.fly()
Eagle클래스는 Bird클래스 상속. 하지만 Eagle클래스는 fly메소드를 오버라이딩하여 구현 X
따라서 eagle객체의 fly메드를 수행하는 순간 Bird클래스의 fly메소드가 수행되어 NotImplementedError가 발생
🐢----
사용자 정의 예외 클래스
Exception 클래스를 상속해서 새로운 예외 타입 정의
사용 시 raise 키워드로 발생
class MyCustomError(Exception):
pass
def do_something(x):
if x < 0:
raise MyCustomError("x는 음수가 될 수 없습니다.")
return x * 2
try:
do_something(-1)
except MyCustomError as e:
print("사용자 정의 예외 발생:", e)
+ __str__(self) 메소드를 이용해서도 오류 메시지 출력 가능: 해당 예외 객체가 문자열로 어떻게 표현될지
class MyError(Exception):
def __str__(self):
return "허용되지 않는 별명입니다."
try:
say_nick("천사")
say_nick("바보")
except MyError as e:
print(e)
'언어 > Python' 카테고리의 다른 글
표준 라이브러리 (0) | 2025.01.06 |
---|---|
파이썬 내장 함수 (0) | 2025.01.05 |
패키지(Package) (2) | 2025.01.01 |
클래스/객체/인스턴스 (0) | 2025.01.01 |
함수(Function) (0) | 2024.12.31 |