2.1 예외 생성하기
이길 수 없다면 그냥 수용해. 프로그램에서 에러가 발생하는 걸 피할 수 없다면, 그걸 컨트롤하는 방법을 배워야 해. 그러니 의도적으로 예외를 만들어보자.
가장 간단한 예외의 예시는 0으로 나누기야. 프로그램도 간단하지:
x = 100 / 0
이런 코드는 에러를 발생시킬 거야:
Traceback (most recent call last):
File "", line 1, in
x = 100 / 0
~~~^~
ZeroDivisionError: division by zero
ZeroDivisionError
— 이건 예외의 이름이고, division by zero
는 그 짧은 설명이야. 또한 Python은 예외가 발생한 줄 번호도 알려줄 거야.
데이터 타입 불일치
물론 다른 예외도 있어. 예를 들어 문자열과 숫자를 더하려고 할 때:
s = "100" + 100
이때는 TypeError
예외가 발생할 거야:
Traceback (most recent call last):
File "", line 1, in
TypeError: unsupported operand type(s) for +: 'str' and 'int'
리스트 인덱스 초과
또 하나의 흔한 에러는 리스트에 없는 요소에 접근할 때 발생하는 거야:
my_list = [1, 2, 3]
print(my_list[10])
이때는 IndexError
예외가 발생할 거야:
Traceback (most recent call last):
print(my_list[10])
~~~~~~~^^^^
IndexError: list index out of range
예외는 정말 많아. 사실 수천 가지 종류가 있지. 심지어는 특정한 상황을 설명하기 위해 존재하는 예외가 부족하다면 직접 만들 수도 있어. 하지만 가장 인기 있는 건 몇 가지 안 돼.
2.2 가장 인기 있는 예외 목록
예외는 많지만, 신입으로서 가장 잘 알아둬야 할 예외가 있어. 아래에 그 목록을 적어볼게:
예외 | 설명 |
---|---|
Exception |
모든 예외의 기본 클래스. |
IndexError |
시퀀스(예: 리스트, 튜플 등)에서 존재하지 않는 인덱스에 접근할 때 발생. |
KeyError |
사전에 없는 키에 접근할 때 발생. |
NameError |
존재하지 않는 변수에 접근할 때 발생. |
RuntimeError |
다른 타입의 예외에 해당하지 않는 일반적인 런타임 에러. |
StopIteration |
이터레이션이 끝났다는 신호를 보낼 때 발생. |
SyntaxError |
코드에 문법적인 오류가 있을 때 발생. |
IndentationError |
코드의 들여쓰기 오류 시 발생 (SyntaxError 의 하위 타입). |
TabError |
탭과 공백을 섞어 들여쓰기 할 때 발생 (IndentationError 의 하위 타입). |
TypeError |
호환되지 않는 데이터 타입 간의 연산을 시도할 때 발생. |
UnboundLocalError |
선언되기 전에 로컬 변수를 사용할 때 발생 (NameError 의 하위 타입). |
ValueError |
함수나 연산에 잘못된 값의 인수를 전달할 때 발생. |
ZeroDivisionError |
0으로 나눌 때 발생. |
아마도 신입이니, 처음 몇 개월 동안은 모든 이러한 예외를 겪을 거야. 그리고 이건 나쁜 게 아니야 — 실수로부터 배울 수 있잖아.
2.3 코드의 오류
코드를 짜다가 에러가 발생하는 몇 가지 상황들을 더 살펴보자. 이렇게 하면 나중에 코드에서 에러를 잡아내기 쉬워질 거야:
IndentationError
이 오류는 코드의 들여쓰기가 잘못되었을 때 발생해. 예를 들어, 탭과 공백을 섞거나 들여쓰기의 양이 맞지 않을 때.
def example():
print("Hello")
print("World") # 잘못된 들여쓰기 때문에 IndentationError 발생
example()
NameError
def example():
print(undeclared_variable) # 선언되지 않은 변수를 사용하려고 하면 NameError 발생
example()
ValueError
이 오류는 연산이나 함수가 올바른 타입이지만 잘못된 값을 받았을 때 발생해.
def example():
int("abc") # 숫자가 아닌 문자열을 정수로 변환하려고 하면 ValueError 발생
example()
KeyError
이 오류는 프로그램이 사전에 없는 키에 접근하려고 할 때 발생해.
def example():
my_dict = {"a": 1, "b": 2}
print(my_dict["c"]) # 존재하지 않는 키에 접근하려고 하면 KeyError 발생
example()
SyntaxError
이 오류는 코드에 문법적인 오류가 있을 때 발생해. 즉, 코드가 Python 언어의 문법에 맞지 않을 때.
def example():
eval("if True print('Hello')") # 잘못된 문법 때문에 SyntaxError 발생
example()
미리 알면 준비가 된 거야. 이제 너는 에러를 유발하는 상황들을 인식하고 만들 수 있어. 이제 이 에러들을 처리하는 법을 배울 시간이다.
GO TO FULL VERSION