예외(Exception)는 프로그램 실행 중 발생할 수 있는 예상치 못한 문제 또는 오류 상황을 의미합니다. 예외가 발생하면 프로그램은 중단되기 때문에 이를 적절하게 처리하여 중단을 방지하거나 오류에 대한 정보를 사용자에게 제공해야 합니다.
int(10 / 3)
print(5 / 0) # ZeroDivisionError: division by zero
print(4 / 2)
BaseException
├── Exception ← 우리가 보통 사용하는 예외
│ ├── ValueError
│ ├── TypeError
│ ├── ZeroDivisionError
│ └── ...
├── KeyboardInterrupt
└── SystemExit
👉 BaseException이 따로 있는 이유는 “진짜 에러”와 “프로그램 제어용 이벤트”를 구분하기 위해서입니다.
코드 실행 중 발생한 일반적인 오류
사용자가 Ctrl + C 눌렀을 때 발생
👉 프로그램을 강제로 멈추는 신호
프로그램 종료 요청
👉 내부적으로 exit() 호출 시 발생
👉 KeyboardInterrupt와 SystemExit는 사실 "에러"가 아니라 프로그램을 멈추거나 종료하기 위한 신호
try:
# 예외가 발생할 가능성이 있는 코드
except ExceptionType1: # 'ExceptionType1'에는 실제 예외 유형이 들어갑니다.
# ExceptionType1 예외가 발생했을 때 실행될 코드
except ExceptionType2: # 'ExceptionType2'에는 다른 예외 유형이 들어갑니다.
# ExceptionType2 예외가 발생했을 때 실행될 코드
# 추가적인 except 블록을 계속 추가할 수 있습니다.
else:
# try 블록에서 예외가 발생하지 않았을 때 실행될 코드
finally:
# 예외 발생 여부와 관계없이 항상 실행될 코드
try:
raise KeyboardInterrupt
except Exception:
print("Exception 잡힘")
except BaseException:
print("BaseException 잡힘")
👉 위험한 방식입니다. except: = BaseException까지 잡습니다.
raise는 파이썬에서 의도적으로 예외를 발생시키거나(throw), 현재 발생한 예외를 다시 전달(re-raise)하기 위해 사용하는 키워드입니다. 이를 통해 잘못된 입력이나 비정상적인 상태를 명확하게 알리고, 호출한 쪽에서 적절히 처리하도록 흐름을 제어할 수 있습니다.

try:
print(10 / 3)
print(5 / 0)
print(4 / 2)
except Exception:
print('예외 발생!')
print('프로그램을 종료합니다')
try:
print(10 / 3)
print(5 / 0)
print(4 / 2)
except ZeroDivisionError:
print('예외 발생!')
print('프로그램을 종료합니다')
try:
data = [10, 20, 30, 40, 50]
print(data[0])
print(data[5])
print(data[1])
except IndexError:
print('인덱스 오류')
print('프로그램을 종료합니다')
try:
data = [10, 20, 30, 40, 50]
# print(data[5])
# print(int('안녕'))
print(5 / 0)
except IndexError:
print('인덱스 오류')
except ValueError:
print('입력 오류')
except ZeroDivisionError:
print('0으로 나눌 수 없음')
except Exception:
print('예외 발생!')
else:
print('에러가 발생하지 않은 정상적인 프로그램')
finally:
print('에러에 관계없이 무조건 실행되는 문장')
print('프로그램을 종료합니다')
Exception 객체
├── args → 에러 메시지
├── __str__() → 사용자용 메시지
├── __repr__() → 개발자용 표현
├── __class__ → 에러 타입
└── traceback → 에러 발생 위치 정보
try:
int("abc")
except Exception as e:
print("에러 메시지:", e)
print("에러 타입:", type(e))
print("args:", e.args)
👉 as를 사용하는 이유는 발생한 예외 객체를 변수로 받아서, 그 안에 담긴 정보(에러 메시지, 타입 등)를 활용하기 위해서입니다.
try:
raise Exception('예외가 발생했어요!!')
except Exception as e:
print(e)
def func1():
n = int(input('짝수를 입력하세요: '))
if n % 2 == 1:
raise Exception('홀수를 입력했어요!!')
print(n)
# func1()
try:
func1()
except Exception as e:
print('예외가 발생: ', e)
def func1():
func2()
# try:
# func2()
# except TypeError:
# print('타입이 올바르지 않습니다')
def func2():
func3()
# try:
# func3()
# except TypeError:
# print('타입이 올바르지 않습니다')
def func3():
try:
print('%d' % '문자열')
except TypeError:
print('타입이 올바르지 않습니다')
func1()
# try:
# func1()
# except TypeError:
# print('타입이 올바르지 않습니다')
| 모듈 (1) | 2026.04.30 |
|---|---|
| 매직 메서드 (1) | 2026.04.30 |
| 객체지향 프로그래밍 4대 패러다임 (0) | 2026.04.28 |
| 객체지향 프로그래밍(OOP) (0) | 2026.04.27 |
| 사용자 정의 함수 (0) | 2026.04.27 |