예외처리의 필요성
문제 발생으로 인해 프로그램이 비정상적으로 종료되는것을 막고 발생한 문제에 대한 정보를 전달하기 위해서 사용한다.
try-except 문
예외처리를 위한 기본 구조이다.
작성 방법
try:
실행문
except[발생오류 [as 오류 메세지 변수]]:
오류 발생시 실행할 실행문
try 블록 실행중 오류가 발생하면 except 블록이 실행되고, try 블록에서 오류가 발생하지 않는다면 except 블록은 실행되지 않는다.
예외처리 방법
1. try, except만 쓰는 방법
# try, except 만 쓰는 방법
try:
4 / 0
except:
print("error")
# 결과값
# error
2. 발생 오류만 포함하는 except문
# 발생 오류만 포함한 except문
try:
4 / 0
except ZeroDivisionError:
print("error")
except KeyError:
pirnt("key_error")
# 결과값
# error
3. 발생 오류와 오류 메세지 변수까지 포함한 except문
# 발생 오류와 오류 메세지 변수까지 포함한 except문
try:
4 / 0
except ZeroDivisionError as e:
print(e)
# 결과값
# division by zero

파이썬 내부의 오류 메세지와 같은 내용인걸 확인할 수 있다.
try except문 코드
try:
a = int(input("나누어지는 수를 입력 : "))
b = int(input("나누는 수를 입력 : "))
print(f"{a} / {b} = {a / b}")
except ZeroDivisionError as e:
print(e)
print("0으로 나눌 수 없습니다.")
except ValueError as e:
print(e)
print("정수만 입력할 수 있습니다.")
# 결과값
# 나누어지는 수를 입력 : 32
# 나누는 수를 입력 : 2
# 32 / 2 = 16.0
# 결과값
# 나누어지는 수를 입력 : 32
# 나누는 수를 입력 : 0
# division by zero
# 0으로 나눌 수 없습니다.
# 결과값
# 나누어지는 수를 입력 : 32
# 나누는 수를 입력 : 다섯
# invalid literal for int() with base 10 : '다섯'
# 정수만 입력할 수 있습니다.
else, finally 문
try:
코드 작성 영역
except:
예외 발생시 처리 영역
else:
예외가 없을 때 처리 영역
finally:
언제나 실행되는 영역
try:
a = int(input("나누어 지는 수를 입력 : "))
b = int(input("나누는 수를 입력 : "))
result = a / b
except:
print(e)
else:
print(f"{a} / {b} = {result}")
finally:
print("프로그램 종료")
# 정상적인 결과값
# 나누어 지는 수를 입력 : 4
# 나누는 수를 입력 : 2
# 4 / 2 = 2.0
# 프로그램 종료
# 오류 결과값
# 나누어 지는 수를 입력 : 4
# 나누는 수를 입력 : 0
# division by zero
# 프로그램 종료
try, except, finally 구문의 조합
- try 구문은 단독으로 사용할 수 없으며, 반드시 except 구문 또는 finally 구문과 함께 사용해야 한다.
- else 구문은 반드시 except 구문 뒤에 사용해야 한다.
- else 구문은 여러개를 사용할 수 없다.
- 가능한 조합
- try + except
- try + except + else
- try + except + finally
- try + except + else + finally
- try + finally
- 가능한 조합 외의 모든 조합은 구문 오류가 발생한다.
try:
num_a = int(input("정수 입력 : "))
print(num_a)
else:
print("프로그램 종료")
# 결과값
# SyntaxError: expected 'except' or 'finally' block
finally 활용 방법
1. 파일이 제대로 닫혔는지 확인하기
try:
f = open("info.txt", "w")
예외.발생
except:
print("오류가 발생했습니다")
finally:
f.close()
print("file.closed :", f.closed)
# 결과값
# 오류가 발생했습니다.
file.closed : True
2. try 구문 내부에서 return 키워드를 사용하는 경우
def test():
print("test() 함수의 첫 줄")
try:
print("try 구문 실행")
return
print("try 구문의 return 키워드 뒤")
except:
print("except 구문 실행")
else:
print("else 구문 실행")
finally:
print("finally 구문 실행")
print("test() 함수의 마지막 줄")
test()
# 결과값
# test() 함수의 첫 줄
# try 구문 실행
# finally 구문 실행
try 구문 중간에 return 으로 탈출해도 finally가 실행된다.
따라서 함수 내부에서 파일 처리 코드를 깔끔하게 만들고 싶을 때 finally를 주로 활용한다.
raise
강제로 예외를 발생시키는 함수이다.
raise Exception("강제로 발생시킨 예외")
# 결과값
# Exception: 강제로 발생시킨 예외
# 테스트 용도로 많이 사용한다
try:
raise Exception("강제로 발생시킨 예외")
except Exception as e:
print("발생한 예외 메세지는")
print(e)
# 결과값
# 발생한 예외 메세지는
# 강제로 발생시킨 예외
사용자 예외 클래스
Exception 클래스를 상속받는 클래스를 생성한다.
class HourError(Exception):
def __init__(self):
super().__init__("올바른 시간이 아닙니다")
try:
hour = int(input("시간을 입력하세요"))
if hour < 0 or hour > 23:
raise HourError
except HourError as e:
print(e)
# 결과값
# 시간을 입력하세요 : 15
# 결과값
# 시간을 입력하세요 : 26
# 올바른 시간이 아닙니다.
오류의 종류
1. 구문 오류(Syntex Error)
괄호의 갯수, 들여쓰기 문제 등으로 프로그램이 실행되기도 전에 발생하는 오류로 프로그램이 실행조차 되지않기 때문에 예외처리로는 처리할 수 없다. 따라서 구문 오류가 발생한 코드를 수정해야한다.
# 프로그램 시작
print("프로그램 시작")
# 구문 오류 발생 코드
print("오류 발생)
# 결과값
# SyntaxError: unterminated string literal (detected at line 5)
# 프로그램 시작이라는 문구조차 실행되지 않음 -> 코드가 실행조차 되지 않음
2. 런타임 오류(Runtime Error)
프로그램이 실행중에 발생하는 오류로 예외 라고도 한다.
# 프로그램 실행
print("프로그램 실행")
# 예외 발생 코드
list_a[1]
# 결과값
# 프로그램 실행
# NameError: name 'list_a' is not defined
# 프로그램은 실행이 되어서 '프로그램 실행' 이라는 print() 함수가 실행되고
# 그 이후에 없는 변수를 가져오라 해서 오류가 발생했다
# 결론 : 프로그램 자체는 실행되지만 중간에 오류가 발생한 것이기 때문에 런타임 에러라고 한다
조건문으로 예외 처리하기(기본 예외 처리)
조건문을 사용하지 않은 예외 처리 방법
# 숫자를 입력 받음
user_input = input("정수 입력 : ")
# 숫자로 변환
number_input = int(user_input)
# 출력
print(number_input)
# 결과값
# 정수 입력 : 1
# 1
# 결과값
# 정수 입력 : yes
# ValueError: invalid literal for int() with base 10: 'yes'
조건문을 사용한 예외 처리 방법
# 숫자를 입력 받음
user_input = input("정수 입력 : ")
# 사용자의 입력이 숫자로만 구성되어 있을 때
if user_input.isdigit(): # 숫자로만 구성된 글자인지 확인하는 메서드
# 숫자로 변환
number_input = int(user_input)
# 출력
print(number_input)
else:
print("정수를 입력하지 않았습니다.")
# 결과값
# 정수 입력 : 3
# 3
# 결과값
# 정수 입력 : yes
# 정수를 입력하지 않았습니다.
try-except 구문은 if 구문을 활용하는 예외처리 방법에 비해 속도가 느린편이다. 따라서 최대한 if 구문을 활용해서 가능한 예외처리를 해주는것이 낫다.
try-except 구문과 pass 키워드의 조합
예외가 발생하면 일단 처리해야 하지만, 해당 코드가 딱히 중요한 부분이 아니라면 일단 try-except 구문으로 프로그램 강제종료만 막을 수 있다.
list_input_a = ["52", "273", "32", "스파이", "103"]
list_num = []
for i in list_input_a:
try:
float(i) # 예외가 발생한다면 다음 코드가 진행되지 않음
list_num.append(i) # 예외없이 통과한다면 리스트에 추가함
except:
pass # 예외가 발생해도 그냥 넘어간다
print(list_num)
# 결과값
# ['52', '273', '32', '103']
숫자로 변환할 수 없는 데이터라면 float(i) 부분에서 예외가 발생할 것이다.
하지만 except 구문에서 따로 처리를 안하고 프로그램 강제 종료만 안되도록 예외처리를 했다.