[파이썬 기초 문법] 14장. 예외처리
21 Jun 2019
Reading time ~3 minutes
이 포스트는 윤성우님의 저서 열혈 파이썬 기초편을 기반으로 작성한 글입니다.
윤성우 열혈 파이썬 기초편
14장. 예외처리
1.예외가 발생하는 상황
>>> lst = [1, 2, 3]
>>> lst[3]
Traceback (most recent call last):
File "<pyshell#40>", line 1, in <module>
lst[3]
IndexError: list index out of range
위와 같이 인덱스를 벗어나서 참조하면 IndexError가 발생한다.
>>> 3 + "coffee"
Traceback (most recent call last):
File "<pyshell#41>", line 1, in <module>
3 + "coffee"
TypeError: unsupported operand type(s) for +: 'int' and 'str'
위와 같이 다른 타입의 데이터를 연산하면 TypeError가 발생한다.
>>> 3 / 0
Traceback (most recent call last):
File "<pyshell#42>", line 1, in <module>
3 / 0
ZeroDivisionError: division by zero
위와 같이 0으로 나누는 연산을 하면 ZeroDivisionError가 발생한다.
2.예외의 처리
# age.py
def main():
print("안녕하세요.")
age = int(input("나이를 입력하세요: "))
print("입력하신 나이는 다음과 같습니다:", age)
print("만나서 반가웠습니다.")
main()
'''
안녕하세요.
나이를 입력하세요: 스물
'''
Traceback (most recent call last):
File "age.py", line 9, in <module>
main()
File "age.py", line 5, in main
age = int(input("나이를 입력하세요: "))
ValueError: invalid literal for int() with base 10: '스물'
age_expt.py
def main():
print("안녕하세요.")
try:
age = int(input("나이를 입력하세요: "))
print("입력하신 나이는 다음과 같습니다:", age)
except ValueError:
print("입력이 잘못되었습니다.")
print("만나서 반가웠습니다.")
main()
'''
안녕하세요.
나이를 입력하세요: 서른
입력이 잘못되었습니다.
만나서 반가웠습니다.
'''
3.보다 적극적인 예외의 처리
age_expt_conti.py
def main():
print("안녕하세요.")
while True:
try:
age = int(input("나이를 입력하세요: "))
print("입력하신 나이는 다음과 같습니다:", age)
break # 입력이 정상적이면 while 루프 탈출!
except ValueError:
print("입력이 잘못되었습니다.")
print("만나서 반가웠습니다.")
main()
'''
안녕하세요.
나이를 입력하세요: 스물
입력이 잘못되었습니다.
나이를 입력하세요: 20
입력하신 나이는 다음과 같습니다: 20
만나서 반가웠습니다.
'''
4.둘 이상의 예외를 처리하기
div_expt2.py
def main():
bread = 10 # 열 개의 빵
try:
people = int(input("몇 명? "))
print("1인당 빵의 수: ", bread / people)
print("맛있게 드세요.")
except ValueError:
print("입력이 잘못되었습니다.")
except ZeroDivisionError:
print("0으로는 나눌 수 없습니다.")
main()
'''
몇 명? 0
0으로는 나눌 수 없습니다.
'''
5.예외 메시지 출력하기와 finally
div_expt3.py
def main():
bread = 10 # 열 개의 빵
try:
people = int(input("몇 명? "))
print("1인당 빵의 수: ", bread / people)
print("맛있게 드세요.")
except ValueError as msg: # 변수 msg에 오류 메시지가 담긴다.
print("입력이 잘못되었습니다.")
print(msg) # 오류 메시지 출력
except ZeroDivisionError as msg: # 변수 msg에 오류 메시지가 담긴다.
print("0으로는 나눌 수 없습니다.")
print(msg) # 오류 메시지 출력
main()
'''
몇 명? 0
0으로는 나눌 수 없습니다.
division by zero
'''
div_expt4.py
def main():
bread = 10 # 열 개의 빵
try:
people = int(input("몇 명? "))
print("1인당 빵의 수: ", bread / people)
print("맛있게 드세요.")
except ValueError:
print("입력이 잘못되었습니다.")
finally:
print("어쨌든 프로그램은 종료합니다.")
main()
'''
몇 명? 0
어쨌든 프로그램은 종료합니다.
'''
Traceback (most recent call last):
File "div_expt4.py", line 15, in <module>
main()
File "div_expt4.py", line 8, in main
print("1인당 빵의 수: ", bread / people)
ZeroDivisionError: division by zero
6.모든 예외 그냥 무시하기
ignore_expt.py
def main():
bread = 10 # 열 개의 빵
try:
people = int(input("몇 명? "))
print("1인당 빵의 수: ", bread / people)
print("맛있게 드세요.")
except: # 이렇게 하면 모든 예외가 다 걸려든다.
print("뭔지는 몰라도 예외가 발생했군요.")
main()
'''
몇 명? 글쎄요
뭔지는 몰라도 예외가 발생했군요.
'''