본문 바로가기

Programing/Python

[Python 입문] 17. 파이썬 오류와 예외처리 (1)

목차

  • 구문 오류
  • 실행 오류
  • Traceback

파이썬의 오류

 먼저 오류를 처리하는 방법을 알기 전에 어떤 상황에 오류가 발생하는지 알아야 한다. 보통 프로그래밍 언어나 프로그램에서 발생하는 오류는 아래와 같이 두 가지가 존재한다.

 

     - 구문 오류(Syntax Error): 컴파일시 나는 문법에서 발생하는 오류

     - 실행 오류(Runtime Error): 프로그램 실행 도중 발생하는 오류

 

 따라서 컴파일을 해야 하는 언어들은 컴파일 당시에 구문 오류가 나고, 구문 오류를 고친 후 컴파일이 완료되면 실행을 시킬 수 있다. 그리고 말 그대로 실행 중에 오류가 나면 실행 오류다. 따라서 컴파일을 해야 하는 언어들의 경우 구문 오류와 실행 오류의 구분이 거의 명확하다.

 이런 오류들의 발생 이유는 어느 지점에서 구문 오류가 나는지, 어떤 인터프리터를 사용하는지에 따라서 다르고, 또 다른 중간 언어로 컴파일 되는지의 여부에 따라서도 다르다. 하지만 어떤 구문을 해석하는 도중 발생하면 구문 오류고, 명령어를 실행하는 도중에 나면 실행 오류라는 점에는 변함이 없다.

 

 

1. 구문 오류(Syntax Error)

 구문 오류는 대부분 오타나 들여쓰로 인해 발생하는 경우가 많다. 괄호나 부호를 빼먹었거나 들여쓰기를 잘못하는 것처럼 '문법'에 맞지 않게 문장을 작성한 경우 아래와 같이 오류가 발생한다.

# 괄호 빠짐 예시
print"Hello world")

# 오류 발생
  File "/jump_to_python/05/Error.py", line 1
    print"Hello world")
                     ^
SyntaxError: invalid syntax


# 쌍따옴표 빠짐 예시
print("Hello world)

# 오류 발생
  File "/jump_to_python/05/Error.py", line 1
    print("Hello world)
                      ^
SyntaxError: EOL while scanning string literal

 위와 같은 경우 print뒤에 괄호나 쌍따옴표 한쪽이 없기 때문에 문법적인 이유로 SyntaxError가 발생했다. (친절하게 어떤 문장에서 발생했는지 까지 알려준다.)

 

 

2. 실행 오류(Runtime Error)

 실행 오류(런타임 오류)는 파이썬 인터프리터가 번역한 명령어가 실행 도중 오류가 발생하는 경우다. 오류가 발생하는 경우의 수는 무수히 많지만 보통 아래와 같은 경우에 주로 오류가 발생한다. (아래의 예시 외에도 다양한 오류가 존재한다.)

 

2.1. NameError

 이 오류는 아래와 같이 선언되지 않는 변수가 있을 경우 발생한다. (name ' ' is not defined)

# print에서 t를 생략했을 때
prin("Hello")

# 오류 발생
Traceback (most recent call last):
  File "/Users/HenryKim/Documents/python_study_new/jump_to_python/05/Error.py", line 4, in <module>
    prin("Hello")
NameError: name 'prin' is not defined


# 쌍따옴표를 생략했을 때
print(hello)

# 오류 발생
Traceback (most recent call last):
  File "/jump_to_python/05/Error.py", line 5, in <module>
    print(hello)
NameError: name 'hello' is not defined

 

2.2. IndexError

 list를 선언했지만 내부에 아무 값도 없거나 리스트에 없는 값을 출력하려고 할 때 오류가 발생한다.

# 비어있는 리스트
list = []
print(list[0])

# 오류 발생
Traceback (most recent call last):
  File "/jump_to_python/05/Error.py", line 9, in <module>
    print(list[0])
IndexError: list index out of range


# 리스트에 없는 값
a = [1, 2, 3]
print(a[5])

# 오류 발생
Traceback (most recent call last):
  File "/jump_to_python/05/Error.py", line 13, in <module>
    print(a[5])
IndexError: list index out of range

 

 위와 같이 list 중 첫 번째를 인덱싱 하고자 했지만 해당 리스트가 비어있기 때문에 오류가 발생했다.

 

2.3. ZeroDivisionError

 아래와 같이 0을 다른 숫자와 나누는 경우도 역시 오류가 발생한다.

# 0과 4 나누기
print(4/0)

# 오류 발생
Traceback (most recent call last):
  File "/jump_to_python/05/Error.py", line 16, in <module>
    print(4/0)
ZeroDivisionError: division by zero

 어떤 숫자를 0으로 나누거나 0으로 어떤 수를 나누려고 할때 해당 오류가 발생한다.

 

2.4. FileNotFoundError

 디렉토리 안에 없는 파일을 오픈하려고 시도할 때 발생하는 오류다.

# 파일 오픈
f = open("None", 'r')

# 오류 발생
Traceback (most recent call last):
  File "/jump_to_python/05/Error.py", line 18, in <module>
    f = open("None", 'r')
FileNotFoundError: [Errno 2] No such file or directory: 'None'

 위오 같이 해당 디렉토리에 없는 파일을 오픈하려고 할 때 해당 오류가 발생한다.

 

 

3. Traceback

 보통 오류가 발생하면 위의 예시들과 같이 Traceback 정보를 제공한다. 예를 들어 Traceback는 어느 함수가 실행하다가 왜 오류가 발생했는지 알려주는 함수의 콜 체인(call chain)이다. 위의 예시들을 보면 line의 위치까지 정확하게 알려주고 있다.

Traceback (most recent call last):
  File "/jump_to_python/05/Error.py", line 9, in <module>   <---- 오류 발생 위치
    print(list[0])
IndexError: list index out of range

 

 간략하게라도 파이썬에서 발생할 수 있는 몇 가지 오류에 대해 알아봤다. 이런 오류들은 파이썬뿐만 아니라 모든 프로그래밍 언어에서 발생할 수 있다. 오류가 발생할 수 있는 모든 경우의 수를 기억하고 미리 대처할 수는 없다. 대신 프로그래밍을 하면서 오류가 발생할 때마다 그 상황을 잘 파악하고 해결하는 것이 중요할 것 같다.

 

 

내용 출처: 책 '점프 투 파이썬'의 내용