Python의 오류를 처리하는 방법에 대해 알아봅니다.
: 파이썬은 오류가 발생하면 프로그램을 중단하고 오류 메시지를 보여 준다.
>>> f = open("나없는파일", 'r')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
FileNotFoundError: [Errno 2] No such file or directory: '나없는파일'
>>> 4 / 0
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ZeroDivisionError: division by zero
>>> a = [1, 2, 3]
>>> a[3]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: list index out of range
try:
... # 오류가 발생할 수 있는 구문
except 발생오류 as 오류변수:
... # 오류 발생
else:
... # 오류 발생하지 않음
finally:
... # 무조건 마지막에 실행
try:
...
except [발생오류 [as 오류변수]]:
...
[]: 괄호 안의 내용을 생략할 수 있다는 관례적인 표기법.try:
...
except:
...
try:
...
except 발생오류:
...
try:
...
except 발생오류 as 오류변수:
...
# try_except.py
try:
4 / 0
except ZeroDivisionError as e:
print(e) # division by zero# try_finally.py
try:
f = open('foo.txt', 'w')
# 무언가를 수행한다.
(... 생략 ...)
finally:
f.close() # 중간에 오류가 발생하더라도 무조건 실행된다.
try:
...
except 발생오류1:
...
except 발생오류2:
...
예) 0으로 나누는 오류와 인덱싱 오류 처리
# many_error.py
try:
a = [1,2]
print(a[3])
4/0
except ZeroDivisionError as e:
print(e)
except IndexError as e:
print(e)
# list index out of range
2개 이상의 오류를 동일하게 처리하기 위해서는 괄호를 사용하여 함께 묶어 처리한다.
try:
a = [1,2]
print(a[3])
4/0
except (ZeroDivisionError, IndexError) as e:
print(e)
try:
...
except [발생오류 [as 오류변수]]:
...
else: # 오류가 없을 경우에만 수행
...
# process_scores.py
students = ["김철수", "이영희", "박민수", "최유진"]
for student in students:
try:
with open(f"{student}_성적.txt", 'r') as f:
score = f.read()
print(f"{student}의 성적: {score}")
except FileNotFoundError:
print(f"{student}의 성적 파일이 없습니다. 건너뜁니다.")
continue # 다음 학생으로 넘어감
# error_pass.py
try:
# 설정 파일을 읽으려 시도
f = open("설정파일.txt", 'r')
config = f.read()
f.close()
except FileNotFoundError:
pass # 설정 파일이 없어도 계속 진행
# 프로그램의 주요 기능은 계속 수행
print("프로그램이 정상적으로 실행됩니다.")
# error_raise.py
class Bird:
def fly(self):
raise NotImplementedError
class Eagle(Bird):
pass
eagle = Eagle()
eagle.fly() # NotImplementedError
# => Bird 클래스를 상속받는 자식 클래스는 반드시 fly 함수를 구현해야 한다
class MyError(Exception):
pass
def say_nick(nick):
if nick == '바보':
raise MyError()
print(nick)
say_nick("천사") # 천사
say_nick("바보") # MyError
try:
say_nick("천사")
say_nick("바보")
except MyError:
print("허용되지 않는 별명입니다.")
# 천사
# 허용되지 않는 별명입니다.
class MyError(Exception):
def __str__(self):
return "허용되지 않는 별명입니다."
try:
say_nick("천사")
say_nick("바보")
except MyError as e:
print(e)
# 천사
# 허용되지 않는 별명입니다.