본문 바로가기

프로그래밍 언어/python

예외 처리 관련 궁금즘 해소

Q. A함수 안에서 B 함수를 호출하였고, B 함수 도중에 예외 처리가 발생한 상황이다.
A 함수, B 함수 각각의 Try Except 여부에 따라 동작 방식은?

 

상황 1)

def B():
    # 예외가 발생할 수 있는 코드
    raise Exception("B 함수에서 오류 발생")

def A():
    try:
        B()
    except Exception as e:
        print(f"A에서 처리한 예외: {e}")

A()

>>>  A에서 처리한 예외: B 함수에서 오류 발생

- B에서 raise 시키고 따로 except 처리 하지 않으면 A에서 걸린다.

 

상황 2)

def B():
    try:
        # 예외가 발생할 수 있는 코드
        raise Exception("B 함수에서 오류 발생")
    except Exception as e:
        print(f"B에서 처리한 예외: {e}")

def A():
    try:
        B()
    except Exception as e:
        print(f"A에서 처리한 예외: {e}")

>>> B에서 처리한 예외: B 함수에서 오류 발생
- B에서 except 처리하면 A에서 except 안 걸린다.

 

상황 3)

def B():
    try:
        # 예외가 발생할 수 있는 코드
        pas
    except Exception as e:
        raise Exception("B 함수에서 오류 발생")
        print(f"B에서 처리한 예외: {e}")

def A():
    try:
        B()
    except Exception as e:
        print(f"A에서 처리한 예외: {e}")

A()

>>> B함수에서 except 이후에 raise를 발생 시키면 A함수에서 걸린다.

 

 

결론

- raise 이후 프로그램 흐름상 가장 빨리 만나는(?) except에서 단 한번 처리가 되며,

- exception 안에서 raise를 발생 시켜도 마찬가지로 그다음 except에서 처리된다.

- 예외 처리를 한곳에서 관리하고 싶다면, 핵심 흐름을 관리하는 함수 (e.g. A함수)에서만 except 처리하고,

  나머지 곳에서는 raise만 수행한다.

 


파이썬 내장 예외 목록

- 예시: ZeroDivisionError, NameError, TypeError

https://docs.python.org/ko/3.13/library/exceptions.html

 

 

현상)

A함수에서 호출하는 B함수에서 raise가 발생했고, A 함수에 except가 있었는데 
A함수를 호출하는 C함수의 except에서 걸렸다?

C-> A -> B

반응형

'프로그래밍 언어 > python' 카테고리의 다른 글

self의 의미  (0) 2023.03.27
Python에서 Call By Reference 구현하는 법  (0) 2023.03.13
파이썬 프로퍼티(Property)  (0) 2023.01.08
Data Classes  (0) 2022.12.11
[OS] python 과 실행파일  (0) 2021.04.09