코딩에 처음 입문할 때 가장 대중적으로 선택하는 프로그래밍 언어인 파이썬. 문법이 간결하고 배우기 쉽다는 장점 덕분에 파이썬이 다른 언어에 비해 상대적으로 진입장벽이 낮은 것은 사실입니다. 하지만 아무리 쉽다고 하더라도 프로그래밍 지식이 전혀 없는 사람이 새로운 언어를 배울 때면 시행착오를 거칠 수밖에 없어요.
'분명히 하라는 대로 똑같이 코드를 받아 적었는데…' 갑자기 에러 메시지를 맞닥뜨리는 상황, 누구나 겪어 봤을 거예요. 실습하다가 에러가 발생하면 도대체 무엇이 문제인지 몰라 당황스럽기 마련입니다. 영어로 길게 쓰여 있는 탓에 프로그래밍이 익숙하지 않은 초심자들에게는 다소 무섭게 느껴질 수 있어요. 하지만 에러 메시지에는 많은 정보가 담겨 있고 생각보다 친절하기 때문에, 겁먹지 말고 차근차근 뜯어보면 에러를 해결할 수 있습니다.
<파이썬 에러 예시>
Traceback (most recent call last):
File "codeit.py", line 12, in <module>
numbers[right] = temp[left]
TypeError: 'int' object is not subscriptable # 에러의 종류 : 에러에 대한 세부 정보
파이썬 에러 메시지는 위와 같은 구조로 이루어져 있습니다. Traceback은 파이썬 프로그램 실행 중에 발생한 에러를 추적해주는 모듈로, 코드가 잘못 작성 되었을 경우 Traceback을 먼저 출력하고 이어서 에러에 대한 세부적인 정보를 콘솔에 띄워줍니다. 에러 메시지를 읽을 때는 밑에서부터 읽으면 해석하기 쉬운데요. 가장 아랫줄에서 어떤 종류의 에러가 발생했는지 알려주기 때문입니다.
그렇다면 파이썬에는 어떤 종류의 에러가 있을까요? 코드잇 커뮤니티에서 수강생들이 가장 많이 질문한 에러 TOP7을 지금 바로 알아봅시다.
<코드잇 커뮤니티 질문 중 파이썬 에러 관련 질문 비율>
TypeError
는 파이썬 코드를 작성하다 보면 가장 흔히 만나게 되는 에러로 데이터 타입과 관련된 에러입니다. 잘못된 데이터의 유형이 연산이나 함수에 적용될 때 발생합니다. TypeError
에 뒤이어 나오는 내용은 어떤 유형이 불일치하는지에 대한 세부 정보를 제공해줍니다.
예)
TypeError: 'int' object is not subscriptable
정수형을 인덱싱 할 수 없다는 의미. 리스트나 문자열이 아닌 정수형을 인덱싱하려고 할 때 발생.
TypeError: 'float' object cannot be interpreted as an integer
'float' 는 정수로 인식될 수 없다는 의미. 꼭 정수형을 넘겨줘야되는 파라미터에 실수형을 넘겨주면 발생. 주로 range 함수 내에 정수형(int)이 아닌 실수형(float)를 입력하면 만나게 되는 에러.
TypeError: list indices must be integers or slices, not str
리스트의 인덱스는 문자형이 아니라 정수형이나 슬라이스(범위)여야 한다는 의미. 파이썬의 리스트를 인덱싱할 때 정수가 아닌 문자열로 인덱싱할 때 발생.
SyntaxError
는 프로그램 구문이 잘못 쓰였을 경우 발생하는 에러로, 주로 철자가 정확하지 않거나 따옴표, 괄호, 콜론 등을 빠뜨렸을 때 발생합니다.
예)
SyntaxError: invalid syntax
파이썬에서 쓰지 않는 문법이라는 의미. 문법적인 에러가 있을 때 발생.
SyntaxError: EOL while scanning string literal
문자열을 스캔하던 도중 '라인이 끝나버렸다(EOL=End of Line)'는 의미. 따옴표가 누락되었을 경우 발생.
IndexError
는 리스트의 범위를 벗어난 인덱스에 접근하려 하는 경우 발생하는 에러입니다. 해당 에러를 만났을 때는 리스트의 사이즈 얼마인지, 접근하려고 한 인덱스가 리스트의 사이즈보다 크지 않은지 확인해보면 좋습니다.
예)
IndexError: list index out of range
리스트의 인덱스가 범위를 벗어났다는 의미.
NameError
는 사용하려는 로컬 또는 글로벌 변수의 이름을 찾을 수 없을 때 발생하는 에러입니다. NameError
에 뒤이어 나오는 내용은 찾을 수 없는 이름이 무엇인지 알려줍니다. 해당 에러를 만났을 때는 변수의 이름이 제대로 지정되었는지 확인해야 합니다. 주로 들여쓰기를 제대로 하지 않아서 발생하는 경우가 많습니다.
예)
NameError: name 'codeit' is not defined
'codeit'이라는 이름의 변수가 정의되지 않았다는 의미. 변수가 제대로 선언되었는지 확인 필요.
AttributeError
는 속성 참조 또는 할당이 실패하면 발생하는 에러입니다. NameError
와 유사하게 속성의 이름을 잘못 썼을 때 발생하는 경우가 많습니다.
예)
AttributeError: module '' has no attribute ''
Import한 모듈의 명령어를 잘못 입력했다는 의미. 모듈의 속성 이름이 잘못되지 않았는지 확인.
ValueError
는 함수가 받은 파라미터가 올바른 자료형이나, 부적절한 값일 때 발생합니다.
예)
ValueError: min() arg is an empty sequence
ValueError: max() arg is an empty sequence
min() 함수나 max()함수의 인자로 빈 리스트를 제공해줬다는 의미.
ValueError: invalid literal for int() with
정수, 소수, 문자열 등 다른 자료형 사이에서 값을 변환할 때 변환이 불가능하면 발생. 예를 들어, a = int("codeit")와 같은 문장은 문자열 codeit을 정수로 변환할 수 없으므로 에러가 발생.
ImportError
는 Import 문에서 모듈을 로드하는 과정에서 문제가 있을 때 발생하는 에러입니다. 주로 파일명이 모듈명과 동일하여 발생하는 경우가 많습니다.
예)
ImportError: attempted relative import with no known parent package
상위 패키지의 위치를 알 수 없다는 의미.
ModulenotfoundError
는 ImportError의 하위 클래스로 모듈을 찾을 수 없을 때 발생하는 에러입니다. 실전 프로젝트를 진행할 때 종종 만나게 되는 에러입니다.
예)
ModuleNotFoundError: No module named 'module_name'
'module_name'이라는 모듈을 찾을 수 없다는 의미.