10가지 일반적인 Python 오류 유형 및 해결 방법
프로그래머로서 소프트웨어 개발 과정에서 오류 발생은 불가피합니다. 이러한 오류는 예상치 못한 결과를 초래하는 논리적 결함, 프로그래밍 언어 규칙 위반, 혹은 프로그램 실행 중 발생하는 문제 등 다양하게 나타날 수 있으며, 일반적으로 '버그'라고 불립니다.
버그는 프로그래밍 언어의 학습 난이도와 관계없이 모든 언어에서 흔히 발생합니다.
예를 들어, 파이썬은 가독성이 높고 표현적인 구문을 사용하며, 다른 언어에 비해 배우기 쉬운 것으로 알려져 있지만, 파이썬을 사용하는 과정에서도 프로그래밍 오류는 여전히 발생할 수 있습니다.
오류 발생은 자연스러운 현상이므로, 오류를 효과적으로 처리하기 위해서는 발생 가능한 다양한 유형의 오류와 그 원인을 파악하는 것이 중요합니다. 이러한 지식을 바탕으로 프로그래밍 과정에서 오류를 예방하거나 최소화할 수 있으며, 오류 발생 시 대처 방법을 익힐 수 있습니다.
다음은 파이썬 프로그래밍 중 흔히 발생하는 몇 가지 오류 유형입니다.
구문 오류
구문 오류는 프로그래밍 언어의 규칙을 어긴 코드를 작성할 때 발생합니다. 이러한 오류는 잘못된 코드 줄을 생성합니다.
예를 들어, 파이썬에서 문자열을 출력할 때는 반드시 따옴표로 묶어야 합니다. 그렇지 않으면 구문 오류가 발생합니다.
또한, 여는 괄호나 닫는 괄호, 대괄호 또는 중괄호를 누락하거나, 키워드나 함수 이름을 잘못 입력하거나, 흐름 제어문의 끝에 콜론을 빠뜨리거나, 수식에서 필요한 연산자를 누락했을 때도 구문 오류가 발생할 수 있습니다.
일반적으로 파이썬 코드 작성 규칙을 위반하면 구문 오류가 발생합니다.
## 문자열 출력 시 따옴표 누락으로 인한 구문 오류
print("Hello World)
age = 20
## if 문에서 콜론 누락으로 인한 구문 오류
if age > 18
print("Age is over 18")
## 닫는 괄호 누락으로 인한 구문 오류
def square(x:
return x * x
print(square(4))
위 코드를 실행하면 다음과 같은 오류 메시지가 나타납니다.
코드 실행 오류 메시지:
File "/home/madici/Desktop/helloworld.py", line 1
print("Hello World)
^
SyntaxError: unterminated string literal (detected at line 1)
이러한 오류를 해결하려면 다음처럼 올바른 파이썬 구문을 사용해야 합니다.
print("Hello World")
age = 20
if age > 18:
print("Age is over 18")
def square(x):
return x * x
print(square(4))
들여쓰기 오류
자바, C 또는 C++과 같은 언어에서는 중괄호를 사용하여 코드 블록을 구분하지만, 파이썬은 들여쓰기를 통해 코드 블록의 계층 구조를 정의합니다. 예를 들어 자바에서 조건문을 작성할 때, 조건이 평가된 후 실행될 코드는 중괄호 안에 작성됩니다.
반면 파이썬에서는 코드 블록을 들여쓰기로 구분합니다. 파이썬에서 일반적인 들여쓰기는 4개의 공백 또는 1개의 탭으로 구성되지만, 코드 전체에서 일관성을 유지하는 한 공백의 개수는 중요하지 않습니다.
파이썬 프로그래머는 제어문이나 함수를 작성할 때 필요한 들여쓰기를 누락하거나, 탭과 공백을 혼용하여 들여쓰기를 하는 경우, 또는 들여쓰기가 잘못된 위치에 있거나 코드 전체에서 일관되지 않을 경우 들여쓰기 오류를 겪을 수 있습니다. 이러한 오류는 인터프리터에 혼란을 야기할 수 있습니다.
들여쓰기 오류가 발생하는 코드 예시:
age = 20
if age > 18:
print("Age is greater than 18")
print("You're allowed to drive")
else:
print("Age is less than 18")
위 코드 실행 시 나타나는 오류 메시지:

코드 실행 오류 메시지:
File "/home/madici/Desktop/helloworld.py", line 3
print("Age is greater than 18")
^
IndentationError: expected an indented block after 'if' statement on line 2
오류를 수정하려면 if 문 다음에 오는 코드 줄을 들여쓰기하고, 나머지 코드의 들여쓰기와 일치하도록 해야 합니다.
age = 20
if age > 18:
print("Age is greater than 18")
print("You're allowed to drive")
else:
print("Age is less than 18")
타입 오류
파이썬에서 TypeError는 호환되지 않는 데이터 타입을 사용하여 연산을 수행하려고 할 때 발생하는 예외입니다. 예를 들어, 문자열과 정수를 더하거나, 문자열 데이터 타입을 정수와 연결하려고 할 때 TypeError가 발생합니다.
잘못된 데이터 타입을 가진 함수나 메서드를 사용하거나, 정수가 아닌 인덱스를 사용하여 리스트와 같은 iterable 객체에 접근하려고 할 때, 또는 iterable 객체가 아닌 객체를 통해 반복하려고 할 때도 TypeError가 발생할 수 있습니다.
일반적으로 잘못된 데이터 타입을 사용하는 연산은 TypeError로 이어집니다.
TypeError를 유발하는 연산의 예시:
# 문자열과 정수를 연결하여 발생하는 타입 오류 age = 25 message = "I am " + age + " years old." list1 = [1, "hello", 5, "world", 18, 2021] # 내장 메서드의 잘못된 사용으로 인한 타입 오류 print(sum(list1)) # 문자열과 정수를 더하여 발생하는 타입 오류 num1 = 10 num2 = "16" print(num1 + num2) # 정수가 아닌 인덱스를 사용하여 발생하는 타입 오류 list2 = ["hello", "from", "the", "other", "side"] print(list2["1"])
위 코드 실행 시 나타나는 오류 메시지:

코드의 샘플 TypeError 메시지:
File "/home/madici/Desktop/helloworld.py", line 3, in <module>
message = "I am " + age + " years old."
~~~~~~~~^~~~~
TypeError: can only concatenate str (not "int") to str
오류를 제거하려면 다음과 같이 올바른 데이터 타입을 사용하거나 타입 변환을 수행해야 합니다.
age = 25 message = "I am " + str(age) + " years old." list1 = [1, 5, 18, 2021] print(sum(list1)) num1 = 10 num2 = "16" print(num1 + int(num2)) list2 = ["hello", "from", "the", "other", "side"] print(list2[1])
속성 오류
파이썬에서 AttributeError는 객체에 존재하지 않는 속성을 사용하려고 하거나, 객체에 존재하지 않는 메서드를 호출하려고 할 때 발생합니다. 즉, AttributeError는 객체에 호출되는 속성이나 메서드가 없음을 나타냅니다.
예를 들어, 정수 객체에 문자열 메서드를 호출하면 메서드를 호출하는 객체 유형에 해당 메서드가 없기 때문에 AttributeError가 발생합니다.
아래 예시에서 문자열의 첫 글자를 대문자로 변환하는 데 사용되는 capitalize() 메서드가 정수에 대해 호출됩니다. 결과적으로 int에는 capitalize() 메서드가 없으므로 속성 오류가 발생합니다.
# int 값에 capitalize()를 호출하여 발생하는 속성 오류 num = 1445 cap = num.capitalize() print(cap)
위 코드 실행 시 나타나는 오류 메시지:

코드의 AttributeError 메시지:
File "/home/madici/Desktop/helloworld.py", line 3, in <module>
cap = num.capitalize()
^^^^^^^^^^^^^^
AttributeError: 'int' object has no attribute 'capitalize'
AttributeError를 해결하려면 호출하려는 메서드나 속성이 호출하는 객체 유형에 존재하는지 확인해야 합니다. 이 경우 문자열 데이터 타입에 대해 capitalize()를 호출하면 다음과 같이 오류를 해결할 수 있습니다.

가져오기 오류
파이썬에서 ImportError는 현재 환경에서 찾을 수 없거나 접근할 수 없는 모듈을 가져오려고 할 때 발생합니다. 이는 모듈이 아직 설치되지 않았거나, 경로가 올바르게 구성되지 않았거나, 설치하려는 모듈의 철자가 잘못되었을 때 발생할 수 있습니다.
ImportError에는 찾을 수 없는 모듈을 가져오려고 할 때 발생하는 오류인 ModuleNotFoundError라는 하위 클래스가 있습니다.
예를 들어, 데이터 분석 라이브러리인 pandas를 가져오려고 시도하는 아래 코드는 모듈이 아직 설치되지 않았으므로 이러한 오류를 발생시킵니다.

생성된 ImportError 메시지:
File "/home/madici/Desktop/helloworld.py", line 1, in <module>
import pandas
ModuleNotFoundError: No module named 'pandas'
이러한 오류를 해결하려면 가져오려는 모듈이 설치되어 있는지 확인해야 합니다. 오류가 해결되지 않으면 모듈의 정확한 철자를 사용하고 있는지, 모듈에 접근하기 위한 올바른 파일 경로를 사용하고 있는지 확인해야 합니다.
값 오류
ValueError는 파이썬 함수가 올바른 데이터 타입의 값을 받았지만, 그 값이 부적절할 때 발생하는 예외입니다. 예를 들어, 숫자 값의 제곱근을 구하는 데 사용되는 math.sqrt() 함수는 음수를 인자로 전달하면 ValueError를 반환합니다.
값이 올바른 타입, 즉 숫자이지만 음수이면 함수에 적합하지 않습니다.
숫자나 문자열을 변환하는 int() 함수는 숫자로 표현되지 않는 문자열을 전달하면 ValueError를 반환합니다. "123" 또는 "45"와 같은 문자열을 함수에 전달하면 문자열을 적절한 정수 값으로 변환할 수 있으므로 오류가 발생하지 않습니다.
그러나 "Hello"와 같이 숫자로 표현되지 않는 문자열을 전달하면 ValueError가 반환됩니다. "Hello"는 문자열이지만 상응하는 정수 값이 없기 때문에 부적절한 값입니다.
ValueError를 유발하는 코드 예시:
# sqrt() 함수에 부적절한 정수 값을 전달하여 발생하는 값 오류 import math num = -64 root = math.sqrt(num) print(root) # int() 함수에 숫자로 표현되지 않는 문자열을 전달하여 발생하는 값 오류 numString = "Hello" num = int(numString) print(num)
위 코드 실행 시 나타나는 오류:

생성된 오류 메시지:
File "/home/madici/Desktop/helloworld.py", line 4, in <module>
root = math.sqrt(num)
^^^^^^^^^^^^^^
ValueError: math domain error
오류를 수정하려면 함수에서 적절한 값을 사용해야 합니다.
import math num = 64 root = math.sqrt(num) print(root) numString = "5231" num = int(numString) print(num)
IO 오류
IOError(Input/Output Error)는 입력 또는 출력 작업이 실패할 때 발생하는 예외입니다. 이는 존재하지 않는 파일에 접근을 시도하거나, 장치에 디스크 공간이 부족하거나, 접근 권한이 없는 파일에 접근을 시도하거나, 다른 작업에서 사용 중인 파일에 접근하려고 할 때 발생할 수 있습니다.
파일 작업을 할 때 일반적으로 사용되는 open(), read(), write() 및 close()와 같은 메서드는 이러한 오류를 일으킬 수 있는 메서드입니다.
존재하지 않는 "notes.txt"라는 파일을 열려고 시도하는 아래 코드를 예시로 들 수 있습니다. 이 코드는 FileNotFoundError를 발생시키는 IOError를 유발합니다.

다음 오류 메시지가 나타납니다.
File "/home/madici/Desktop/helloworld.py", line 2, in <module>
file1 = open("notes.txt", "r")
^^^^^^^^^^^^^^^^^^^^^^
FileNotFoundError: [Errno 2] No such file or directory: 'notes.txt'
위 오류를 방지하려면 터미널을 실행하는 디렉터리에 "notes.txt" 파일이 있는지 확인해야 합니다. IOError를 처리하는 또 다른 방법은 아래와 같이 try-except 블록을 사용하는 것입니다.

이름 오류
NameError는 존재하지 않거나 현재 범위에 정의되지 않았거나, 값이 할당되지 않은 변수, 함수 또는 모듈을 사용하려고 할 때 발생하는 예외입니다.
이러한 오류는 일반적으로 변수나 함수 이름을 잘못 입력하거나, 변수 또는 함수를 정의하기 전에 사용하려고 할 때 발생합니다. 모듈을 가져오지 않고 사용하려고 하면 NameError가 발생할 수 있습니다.
다음 코드는 NameError 예외를 유발합니다.
# math 모듈을 가져오지 않아 발생하는 이름 오류
num = 64
root = math.sqrt(64)
print(root)
# 변수 x가 정의되기 전에 사용되어 발생하는 이름 오류
y = 23
print(x)
# 함수 이름이 정의되지 않아 발생하는 이름 오류
def greet():
print("Good morning")
great() #ameError: name 'great' is not defined
위 코드에서 발생하는 오류 메시지:

샘플 NameError 메시지:
File "/home/madici/Desktop/helloworld.py", line 3, in <module>
root = math.sqrt(64)
^^^^
NameError: name 'math' is not defined
이러한 NameError를 해결하려면 모듈을 사용하기 전에 모듈을 가져오고 있는지, 변수나 함수를 정의하기 전에 사용하고 있지 않은지, 함수나 변수 이름의 철자가 정확한지 확인해야 합니다.
import math
num = 64
root = math.sqrt(64)
print(root)
y = 23
print(y)
def greet():
print("Good morning")
greet()
색인 오류
IndexError는 범위를 벗어난 리스트 또는 튜플의 인덱스에 접근하려고 할 때 발생하는 예외입니다. 아래 리스트를 예시로 들어보겠습니다.
list1 = [1, 2, 3, 4, 5]
이 리스트에는 5개의 요소가 있습니다. 파이썬은 인덱스를 0부터 세기 시작합니다. 따라서 위 리스트의 인덱스는 0부터 n-1까지이며, 여기서 n은 리스트의 요소 개수입니다. 이 경우 인덱스 범위는 0에서 4까지입니다.
인덱스가 4보다 큰 요소에 접근하려고 시도하면 IndexError가 발생합니다. 이는 인덱스가 리스트의 범위를 벗어났기 때문입니다. 아래 코드는 IndexError를 유발합니다.
list1 = [1, 2, 3, 4, 5] item = list1[6] #IndexError, 리스트 인덱스가 범위를 벗어남 print(item)
코드 실행 시 나타나는 오류:

생성된 IndexError 메시지:
File "/home/madici/Desktop/helloworld.py", line 2, in <module>
item = list1[6] #IndexError because the list index is out of range
~~~~~^^^
IndexError: list index out of range
IndexError를 피하는 가장 좋은 방법은 range() 및 len() 함수를 사용하여 요소에 접근할 때 항상 범위 내에 있도록 하는 것입니다.
list1 = [1, 2, 3, 4, 5]
for i in range(len(list1)):
print(list1[i])
키 오류
KeyError는 키를 사용하여 딕셔너리에서 항목에 접근하려고 시도할 때, 딕셔너리에서 해당 키를 찾을 수 없을 때 발생하는 예외입니다. 다음 딕셔너리를 예시로 들어보겠습니다.
cities = {"Canada": "Ottawa", "USA": "Washington", "Italy": "Rome"}
이 딕셔너리의 키는 "Canada", "USA", "Italy"입니다. 이 키들을 사용하여 딕셔너리의 항목에 접근할 수 있습니다. 그러나 "Brazil"과 같이 존재하지 않는 키를 사용하여 요소에 접근하려고 하면 아래와 같이 KeyError가 발생합니다.

생성된 KeyError 메시지:
File "/home/madici/Desktop/helloworld.py", line 6, in <module>
print(cities["Brazil"])
~~~~~~^^^^^^^^^^
KeyError: 'Brazil'
KeyError를 해결하려면 딕셔너리의 요소에 접근하는 데 사용하는 키가 실제로 딕셔너리에 존재하는지 확인해야 합니다. 이를 위해 if…else 문을 사용할 수 있습니다.
cities = {"Canada": "Ottawa", "USA": "Washington", "Italy": "Rome"}
country = "Canada"
if country in cities:
print("The capital city of " + country + " is " + cities[country])
else:
print("The key " + country + " is not present in the cities dictionary")
이 방법을 통해 딕셔너리에서 요소에 접근할 때 발생하는 KeyErrors를 방지할 수 있습니다.
결론
파이썬 코딩 시에는 전문 지식 수준과 관계없이 오류가 발생하기 마련입니다. 따라서 문서에서 언급된 다양한 오류 유형에 익숙해져 오류 발생 시 효과적으로 대처할 수 있도록 해야 합니다.
또한, 일반적인 작업을 간소화하기 위해 유용한 파이썬 원라이너를 탐색해 볼 수도 있습니다.