예외 처리

2025. 1. 2.·언어/Python

예외 처리(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
'언어/Python' 카테고리의 다른 글
  • 표준 라이브러리
  • 파이썬 내장 함수
  • 패키지(Package)
  • 클래스/객체/인스턴스
우는거북이
우는거북이
  • 우는거북이
    거북이는 울고 있다
    우는거북이
  • 전체
    오늘
    어제
    • 알아보기 (75) N
      • AI (4)
      • 언어 (16)
        • Python (15)
        • C언어 (1)
      • 알고리즘 (7)
      • 백준 (22)
      • 자료구조 (10)
      • 컴퓨터네트워크 (6)
      • 운영체제 (1)
      • 데이터통신 (9) N
  • 인기 글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
우는거북이
예외 처리
상단으로

티스토리툴바