2026. 5. 23. 14:36ㆍAI/Python
프로그램을 작성하다보면, 프로그램 실행 중 발생할 수 있는 예상치 못한 오류 상황을 맞닥들이게 될 수 있는데
그런 것을 예외라고 부른다. 예외가 발생하면, 프로그램이 중단되거나, 종료되므로 이를 적절하게 처리하여
중단을 방지하거나 오류에 대한 정보를 사용자에게 제공해야 한다.
앞서 메소드에서 어떤 메소드는 에러를 내뿜는 메소드가 있고 그렇지 않은 메소드가 있다고 배웠었다.
에러를 내뿜는 메소드는 이 에러를 처리할 수 있다고 말한적이 있다.
다음과 같은 코드를 실행해보자.
int(10 / 3)
print(5 / 0) # ZeroDivisionError: division by zero
print(4 / 2)
첫번째 줄 실행에는 큰 문제가 없다.
두번째 줄은 숫자는 0으로 나눌 수 없으므로, 에러가 뜬다. 문제는 그 다음부터이다.
세번째 줄은 에러 코드가 아님에도 실행되지 않는다. 이는 에러가 발생하는 순간 프로그램이 중단되기 때문이다.
바로 Python이 인터프리터 방식이므로, 한줄마다 실행결과가 나오기 때문이라고 볼 수 있다.
여기서 에러 발생 시 에러 처리를 하고, 프로그램을 정상 종료하도록 만들어줘야 한다.
예외 계층 구조

에러를 가리키는 Python 환경에서 에러를 통합하는 객체는 BaseException 객체이다.
그 자식 클래스로 Exception, KeyboardInterrupt, SystemExit이 있다.
즉, 우리가 위에서 봤던 Error는 미리 만들어진 클래스인 것이다. 그 클래스는 Exception 클래스 내부에 존재한다.
이런 구조로 되어 있는 것은 진짜 에러와 프로그램 제어용 이벤트를 구분하기 위함이다.
Exception은 코드 실행 중 발생하는 일반적인 오류를 일컫는다.
KeyboardInterrupt는 사용자가 Ctrl+C 눌렀을 때 발생하는 이벤트이다. (프로그램을 강제로 멈추는 신호)
SystemExit은 내부적으로 exit() 호출 시 발생하는 신호이다.
즉 Exception을 제외한 두 클래스는 사실 에러가 아니라 프로그램을 멈추거나 종료하기 위한 신호인 것이다.
예외 처리 기본 구조
try :
# 예외가 발생할 가능성이 있는 코드
except ExceptionType1:
# ExceptionType1 예외가 발생했을 때 실행되는 코드
except ExceptionType2:
# ExceptionType2 예외가 발생했을 때 실행되는 코드
else:
# try 블록에서 예외가 발생하지 않았을 때 실행되는 코드
finally:
# 예외 발생 여부와 관계 없이 항상 실행될 코드
그런데, 에러 발생할 코드란 어떤 것일까? 굳이 그냥 에러를 발생 안시키면 되는 거 아닌가?
하지만 예를 들어 사용자에게 파일을 입력받는데 그 파일이 깨질 수도 있는 것이다. 이런 상황들을 말하는 것이다.
아래 코드로 자세히 살펴보자.
try:
raise KeyboardInterrupt
except Exception:
print("Exception 잡힘")
except BaseException:
print("BaseException 잡힘")
여기서 raise는 무조건 에러를 발생시키는 Python 문법이다. 즉, 의도적으로 예외를 발생시키는 방법이다. (throw)
이를 통해 잘못된 입력이나, 비정상적인 상태를 명확히 알리고, 호출된 쪽에서 적절히 처리하도록 흐름을 제어할 수 있다.
이제 에러가 발생했으므로, except 구문을 찾게 될텐데
에러의 부모 클래스가 처리시키는 것이므로, BaseException으로 올라가게 된다.
그래서 BaseException에서 잡히므로, except BaseException: 코드가 실행되는 것이다.
그런데 except: 라고 작성할 경우, BaseException의 모든 코드를 다 잡으므로,
진짜 오류를 잡을건지 시스템 상 오류를 잡을건지 구분이 가지 않는 문제가 발생한다.
따라서 except: 방식은 절대 사용하지 말자!
주요 예외 타입

에러를 Exception 부모 객체로 catch를 해도 되지만 에러마다 다르게 처리를 하고 싶을 때
개별 Exception 클래스를 이용하고 있다.
예외 객체 내부 구조

try:
int('abc')
except Exception as e:
print("에러 메시지:", e) # Invalid literal for int() with base 10: 'abc'
print("에러 타입:", type(e)) # class ValueError
print("args:", args) # invalid literal for int() with base 10: 'abc'
여기서 alias 문법을 사용한 이유는 발생한 예외 객체를 변수로 받아, 그 안에 담긴 정보를 활용하기 위해서이다.
def func1():
n = int(input("짝수를 입력하세요."))
if n % 2 == 1:
raise Exception("홀수를 입력했어요!")
print(n)
try:
func1()
except Exception as e:
print("예외 발생:", e)'AI > Python' 카테고리의 다른 글
| Python의 기본 - 모듈 (12) (0) | 2026.05.23 |
|---|---|
| Python의 기본 - 매직 메서드 (11) (0) | 2026.05.23 |
| Python의 기본 - 객체 지향 프로그래밍의 패러다임 (9) (0) | 2026.05.17 |
| Python의 기본 - 프로그래밍 방법론 (8) (0) | 2026.05.15 |
| Python의 기본 - 사용자 정의 함수 (7) (0) | 2026.05.14 |