파이썬에는 프로그램 실행 중 자주 발생하는 다양한 내장 예외(built-in exceptions)가 있습니다. 이러한 예외는 프로그래머가 명시적으로 발생시킬 수도 있고, 파이썬 인터프리터가 코드의 오류를 감지하여 암묵적으로 발생시킬 수도 있습니다. 이 글에서는 파이썬에서 가장 흔하게 마주치는 주요 예외들을 예제 코드와 함께 살펴보겠습니다.
1. AssertionError (어설션 오류)
AssertionError는 assert 문이 실패했을 때 발생합니다. 파이썬에서는 코드에 assert 문을 작성할 수 있으며, assert 문의 조건은 항상 참(True)이어야 합니다. 만약 조건이 거짓(False)으로 평가되면 AssertionError가 발생합니다.
예제 코드
class MyClass:
def __init__(self, x):
self.x = x
assert self.x > 50
myObj = MyClass(5)
실행 결과
--------------------------------------------------------------------------- AssertionError Traceback (most recent call last) <ipython-input-21-71785acdf821> in <module>() ----> 6 myObj = MyClass(5) <ipython-input-21-71785acdf821> in __init__(self, x) ----> 4 assert self.x > 50 AssertionError:
위 예제에서 객체를 생성할 때 x 값으로 5를 전달했는데, assert 문은 x가 50보다 커야 한다는 조건을 검사하므로 조건이 실패하여 AssertionError가 발생했습니다.
2. AttributeError (속성 오류)
AttributeError는 클래스나 객체에 존재하지 않는 속성(attribute)에 접근하려고 할 때 발생합니다.
예제 코드
class point:
def __init__(self, x=0, y=0):
self.x = x
self.y = y
def getpoint(self):
print('x= ' + str(self.x))
print('y= ' + str(self.y))
print('z= ' + str(self.z))
pt = point(10, 20)
pt.getpoint()
실행 결과
x= 10
y= 20
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
---> 12 pt.getpoint()
----> 9 print('z= ' + str(self.z))
AttributeError: 'point' object has no attribute 'z'
point 클래스는 x와 y 속성만 정의하고 있지만, getpoint() 메서드에서 정의되지 않은 z 속성에 접근하려고 하기 때문에 오류가 발생합니다.
3. ImportError (임포트 오류)
ImportError는 import 문이 모듈을 가져오는 과정에서 문제가 발생했을 때 일어납니다. from 문의 패키지 이름은 올바르지만, 지정된 이름의 모듈을 찾을 수 없는 경우에도 발생할 수 있습니다.
예제 코드
from math import abcd
실행 결과
--------------------------------------------------------------------------- ImportError Traceback (most recent call last) ----> 1 from math import abcd ImportError: cannot import name 'abcd'
math 모듈은 존재하지만 그 안에 abcd라는 이름의 함수나 객체가 없기 때문에 임포트에 실패합니다.
4. ModuleNotFoundError (모듈 미발견 오류)
ModuleNotFoundError는 ImportError의 하위 클래스입니다. 모듈을 찾지 못했을 때 발생하며, sys.modules에서 None이 발견되는 경우에도 발생할 수 있습니다.
예제 코드
import abcd
실행 결과
--------------------------------------------------------------------------- ModuleNotFoundError Traceback (most recent call last) ----> 1 import abcd ModuleNotFoundError: No module named 'abcd'
abcd라는 이름의 모듈이 시스템에 존재하지 않아 모듈을 찾지 못했다는 오류 메시지가 출력됩니다.
5. IndexError (인덱스 오류)
IndexError는 리스트(List), 튜플(Tuple) 등 시퀀스 자료형에서 유효 범위를 벗어난 인덱스(subscript)로 접근할 때 발생합니다.
예제 코드
myList = [10, 20, 30, 40] print(str(myList[5]))
실행 결과
--------------------------------------------------------------------------- IndexError Traceback (most recent call last) ----> 2 print(str(myList[5])) IndexError: list index out of range
리스트에는 인덱스 0부터 3까지의 요소만 존재하는데, 범위를 벗어난 인덱스 5에 접근하려고 했기 때문에 오류가 발생했습니다.
6. RecursionError (재귀 오류)
RecursionError는 런타임 오류의 일종으로, 최대 재귀 깊이(maximum recursion depth)를 초과했을 때 발생합니다.
예제 코드
def myFunction(): myFunction() myFunction()
실행 결과
--------------------------------------------------------------------------- RecursionError Traceback (most recent call last) ----> 4 myFunction() RecursionError: maximum recursion depth exceeded
myFunction()이 자기 자신을 무한히 호출하기 때문에 파이썬이 허용하는 최대 재귀 깊이를 초과하여 오류가 발생합니다.
7. StopIteration (반복 종료 오류)
파이썬에서는 내장 메서드인 next()를 호출할 때 StopIteration 오류가 발생할 수 있습니다. 이터레이터(iterator)가 더 이상 반환할 요소가 없을 때 next() 메서드가 이 오류를 발생시킵니다.
예제 코드
myList = [10, 20, 30, 40] myIter = iter(myList) while True: print(next(myIter))
실행 결과
10 20 30 40 --------------------------------------------------------------------------- StopIteration Traceback (most recent call last) ----> 4 print(next(myIter)) StopIteration:
리스트의 모든 요소(10, 20, 30, 40)를 출력한 후 더 이상 반환할 값이 없으므로 StopIteration이 발생합니다. 실무에서는 for문이나 try-except 블록으로 이 오류를 처리합니다.
8. IndentationError (들여쓰기 오류)
파이썬 코드에 잘못된 들여쓰기(indentation)가 있을 때 발생하는 오류입니다. IndentationError는 파이썬의 SyntaxError 클래스를 상속받습니다.
예제 코드
for i in range(10):
print("The value of i: " + str(i))
실행 결과
File "<ipython-input-44-d436d50bbdc8>", line 2
print("The value of i: " + str(i))
^
IndentationError: expected an indented block
for 문 아래의 print 문이 들여쓰기 되지 않아, 들여쓰기된 코드 블록이 필요하다는 오류 메시지가 출력됩니다.
9. TypeError (타입 오류)
TypeError는 부적절한 타입의 객체에 연산을 수행하려고 할 때 발생합니다. 예를 들어, 리스트의 인덱스로 부동소수점(float) 숫자를 사용하면 TypeError가 발생합니다.
예제 코드
myList = [10, 20, 30, 40] print(myList[1.25])
실행 결과
--------------------------------------------------------------------------- TypeError Traceback (most recent call last) ----> 2 print(myList[1.25]) TypeError: list indices must be integers or slices, not float
리스트의 인덱스는 반드시 정수(integer) 또는 슬라이스(slice)여야 하며, float 타입은 허용되지 않는다는 의미입니다.
10. ZeroDivisionError (영 나누기 오류)
나눗셈 연산에서 분모가 0일 때 발생하는 오류입니다.
예제 코드
print(5/0)
실행 결과
--------------------------------------------------------------------------- ZeroDivisionError Traceback (most recent call last) ----> 1 print(5/0) ZeroDivisionError: division by zero
수학적으로 0으로 나누는 것은 불가능하므로, 파이썬은 ZeroDivisionError를 발생시켜 프로그램 실행을 중단합니다.
마무리
지금까지 파이썬에서 가장 자주 발생하는 10가지 주요 예외를 알아보았습니다. 각 예외의 발생 원인과 해결 방법을 이해해 두면 디버깅 시간을 크게 단축할 수 있습니다. 또한 try-except 구문을 활용하면 이러한 예외들이 프로그램 전체를 중단시키지 않도록 우아하게 처리할 수 있습니다.