본문 바로가기
I am a developer

파이썬 기초 / Python / Errors / 파이썬 각종 에러 발생 원인

by Echinacea 2023. 5. 28.
반응형

 

 

백준 문제를 풀다 보면 여러 가지의 파이썬 에러를 만나게 된다.

아래는 파이썬 런타임 에러 종류이다.

출처 -  https://help.acmicpc.net/judge/rte

 

 

 

파이썬 런타임 에러 종류들을 하나씩 살펴보자.

 

 

 

1. ValueError

input_value = input("숫자를 입력하세요: ")
number = int(input_value)
print(number)
----------------------------------console------------------------------------
ValueError: invalid literal for int() with base 10: 'ㅇ'

위 코드에서 사용자로부터 입력을 받아 정수로 변환하는 과정에서 ValueError가 발생할 수 있다.
사용자가 숫자가 아닌 다른 값을 입력하면, int() 함수가 해당 값을 정수로 변환할 수 없어 ValueError를 발생시킨다. 예를 들어, 사용자가 "ㅇ"와 같이 숫자가 아닌 값을 입력하면 ValueError가 발생한다.

 

 

 

2. IndexError

my_list = [1, 2, 3]
element = my_list[3]
print(element)
----------------------------------console------------------------------------
IndexError: list index out of range

위 코드에서는 길이가 3인 my_list에서 4번째 요소에 접근하려고 시도하고 있다. 하지만 인덱스는 0부터 시작하기 때문에 4번째 요소는 존재하지 않는다. 이로 인해 IndexError가 발생하게 된다. 배열 인덱스가 유효한 범위 내에 있지 않을 때 IndexError가 발생하게 된다.

 

 

 

3. NameError

print(x)
----------------------------------console------------------------------------
NameError: name 'x' is not defined

위 코드에서는 정의되지 않은 변수 x를 출력하려고 시도한다. x라는 변수가 정의되지 않았기 때문에 NameError가 발생하게 된다. 이는 변수를 사용하기 전에 해당 변수를 정의하거나 초기화해야 함을 보여준다.

 

 

 

4. TypeError

x = "5"
y = 10
result = x + y
print(result)
----------------------------------console------------------------------------
TypeError: can only concatenate str (not "int") to str

위 코드에서는 문자열과 정수를 더하려고 시도한다. 문자열인 x와 정수인 y를 더하려면 두 개의 동일한 유형의 값이 필요하지만, 서로 다른 유형의 값이 더해져서 TypeError가 발생하게 된다. 이를 해결하려면 두 값을 동일한 유형으로 변환하거나 적절한 유형 변환 함수를 사용해야 한다.

 

 

 

5. AssertionError

x = 5
assert x > 10, "x는 10보다 작거나 같아야 합니다."
----------------------------------console------------------------------------
AssertionError: x는 10보다 작거나 같아야 합니다.

위 코드에서는 assert 문을 사용하여 x가 10보다 큰지를 확인하고 있다. 하지만 x의 값이 5이므로 조건이 거짓이 되어 AssertionError가 발생하게 된다. assert 문은 주어진 조건이 거짓일 때 예외를 발생시키는데, 이 경우에는 x가 10보다 작거나 같기 때문에 예외가 발생한다.

 

 

 

6. ImportError

import non_existent_module
----------------------------------console------------------------------------
ModuleNotFoundError: No module named 'non_existent_module'

위 코드에서는 존재하지 않는 모듈인 non_existent_module을 import하려고 시도한다. 해당 모듈이 존재하지 않기 때문에 ImportError가 발생한다. 이는 잘못된 모듈 이름을 사용하거나 필요한 모듈을 설치하지 않은 경우에 발생할 수 있다.

 

 

 

7. FileNotFoundError

file_path = "non_existent_file.txt"
with open(file_path, 'r') as file:
    contents = file.read()
----------------------------------console------------------------------------
FileNotFoundError: [Errno 2] No such file or directory: 'non_existent_file.txt'

위 코드에서는 존재하지 않는 파일인 "non_existent_file.txt"를 열려고 시도한다. 해당 파일이 존재하지 않기 때문에 FileNotFoundError가 발생하게 된다. 이는 파일을 열려고 할 때 파일 경로를 잘못 지정하거나, 파일이 실제로 존재하지 않는 경우에 발생할 수 있다.

 

 

 

8. SyntaxError

if x == 5
    print("x는 5입니다.")
----------------------------------console------------------------------------
SyntaxError: invalid syntax

위 코드에서는 조건문인 if 문이 콜론(:)으로 끝나지 않았다. 이는 파이썬의 구문 규칙에 어긋나므로 SyntaxError가 발생하게 된다. 조건문 뒤에는 반드시 콜론(:)을 붙여야 하므로 아래와 같이 수정해야 한다.

if x == 5:
    print("x는 5입니다.")
----------------------------------console------------------------------------
x는 5입니다.

 

 

 

 

9. EOFError

 

 

유형 1. 사용자가 입력 대기 중에 입력 스트림이 종료되었을 때 발생

input_value = input("값을 입력하세요: ")
print("입력한 값은:", input_value)
----------------------------------console------------------------------------
EOFError

위 코드에서는 사용자로부터 값을 입력받고 출력하는 간단한 예시이다. 그러나 이 코드는 사용자로부터 입력을 받을 때 EOFError가 발생할 수 있다. 이는 사용자가 입력 대기 중에 입력 스트림이 종료되었을 때 발생합니다.

예를 들어, 코드를 실행하고 사용자가 입력 대기 상태에서 Ctrl + D (Unix/Linux) 또는 Ctrl + Z (Windows)를 눌러 입력 스트림을 종료하면 EOFError가 발생하게 된다. 이는 입력 대기 중에 더 이상 입력이 없는 상황에서 발생하는 예외이다.

 

 

 

유형 2. 파일을 읽어오는 도중에 파일의 끝에 도달하여 EOFError가 발생

#test.txt

a
b
c
d

 

try:
    with open("test.txt", "r") as file:
        while True:
            line = file.readline()
            if not line:
                raise EOFError("파일의 끝에 도달했습니다.")
            print(line)
except EOFError as e:
    print(e)
----------------------------------console------------------------------------

a

b

c

d
파일의 끝에 도달했습니다.

 

 

 

유형 3. 입력/출력값의 범위가 잘못되었을 때 발생

start = int(input("시작 값: "))
end = int(input("끝 값: "))

for num in range(start, end + 1):
    print(num)
----------------------------------console------------------------------------
(5, 0 입력시)
시작 값: 5
끝 값: 0

위 코드는 사용자로부터 시작 값과 끝 값 입력을 받아서 해당 범위의 숫자를 출력하는 예시이다. 그러나 시작 값이 끝 값보다 큰 경우, 즉 출력 범위가 잘못된 경우 EOFError를 발생시킨다. 입력을 잘못해도 콘솔에는 아무 에러도 뜨지 않기 때문에 아무 일도 일어나지 않은 것처럼 보이지만, EOFError가 발생하면 프로그램이 중단되었기 때문에 아무 일도 일어나지 않은 것이다.

 

 

여기서 EOFError 를 확인하려면 아래처럼 코드를 추가하면 된다.

start = int(input("시작 값: "))
end = int(input("끝 값: "))

if start > end:
    raise EOFError("출력 범위가 잘못되었습니다.")

for num in range(start, end + 1):
    print(num)
----------------------------------console------------------------------------
(5, 0 입력시)
시작 값: 5
끝 값: 0
Traceback (most recent call last):
  File "경로/test2.py", line 5, in <module>
    raise EOFError("출력 범위가 잘못되었습니다.")
EOFError: 출력 범위가 잘못되었습니다.

 

 

 

10. AttributeError

 

 

유형 1. 존재하지 않는 속성에 접근하는 경우 발생

obj = 'test'
print(obj.attribute)
----------------------------------console------------------------------------
AttributeError: 'str' object has no attribute 'attribute'

 

 

유형 2. 모듈이나 클래스에 존재하지 않는 메서드나 속성에 접근하는 경우 발생

import math
print(math.some_function) 
----------------------------------console------------------------------------
AttributeError: module 'math' has no attribute 'some_function'

 

 

유형 3. 문자열에 존재하지 않는 메서드를 호출하는 경우 발생

string = "Hello, World!"
print(string.reverse())  # 문자열에는 reverse() 메서드가 존재하지 않아 AttributeError가 발생합니다.
----------------------------------console------------------------------------
AttributeError: 'str' object has no attribute 'reverse'

 

 

 

  1. RecursionError
  2. ZeroDivisionError
  3. ModuleNotFoundError
  4. UnboundLocalError
  5. OverflowError

나머지들은 다음 포스팅에…

 

 

 

 

반응형

댓글