728x90
반응형
오류의 종류
# 오류(Error)
# 1. Syntax Error, Compiler error : 프로그램 실행 전에 발생하는 오류
# 2. Runtime Error, Exception : 프로그램 실행 중에 발생하는 오류
# Syntax Erorr = 구문 오류 의 예제
print("# 프로그램이 시작되었습니다!")
print("# 구문 오류를 강제로 발생시킵니다!"
# 예외(Exception) 예제1
print("# 프로그램이 시작되었습니다!")
리스트[1]
# 예외(Exception) 예제2
print("# 프로그램이 시작되었습니다!")
print(int(input("숫자를 입력해주세요> ")))
#만약 input에 문자열을 넣는다면? error가 발생될 것이다
#사용자는 개발자가 예상한대로 사용하지 않는다.
#예외가 너무 다양하기때문에 Syntax error보다 훨씬 까다롭다
기본적인 예외처리 방법
예외가 발생할 수 있는 코드 작성하기
1) 조건문으로 예외 발생막기
# 실수를 넣는다던가, 문자열을 넣으면 에러가 발생한다
# 어떤 예외가 간단하게 떠올릴 수 있다면 if문으로 간단하게 처리를 할 수 있다.
# 가장 기본
입력 = input("정수 입력>")
if 입력.isdigit():
숫자입력 = int(입력)
print(f"원의 반지름: {숫자입력}")
print(f"원의 둘레: {2 * 3.14 * 숫자입력}")
print(f"원의 넓이: {3.14 * 숫자입력 * 숫자입력}")
else:
print("정수를 입력하지 않았습니다.")
2) 예외처리의 try except 구문
# 세상의 예외는 예측하기가 실제로 너무 힘들다
# 그래서 try except를 활용한다.
입력 = input("정수 입력>")
try :
#예외가 발생할 수 있는 코드
숫자입력 = int(입력)
print(f"원의 반지름: {숫자입력}")
print(f"원의 둘레: {2 * 3.14 * 숫자입력}")
print(f"원의 넓이: {3.14 * 숫자입력 * 숫자입력}")
except:
#예외가 발생했을 때 실행할 코드
print("정수를 입력하지 않았습니다.")
# 예를들어 입력이 부동소수점인지 확인하는 코드를 if문으로 작성하게된다면
# 생각보다 많은 시간이 소요되고 어려울 수 있으나
# try-except를 활용하면 간단하게 처리가 가능하다
# 단, 예외를 구분하는 로직을 떠올릴 필요가 없는것이지
# 대충 어떤 예외가 발생할지를 떠올릴 필요가 없어지는 것은 아니므로
# 대충 여기서 무슨 예외가 뜨겠구나는 떠올려야
# try- except로 감쌀 수 있다
입력 = input("정수 입력>")
try :
#예외가 발생할 수 있는 코드
숫자입력 = float(입력)
print(f"원의 반지름: {숫자입력}")
print(f"원의 둘레: {2 * 3.14 * 숫자입력}")
print(f"원의 넓이: {3.14 * 숫자입력 * 숫자입력}")
except:
#예외가 발생했을 때 실행할 코드
print("숫자를 입력하지 않았습니다.")
3) try except 구문 + pass키워드
try :
except :
#이쪽을 비우게 되는 경우가 있을 수도 있는데
#이때 비워버리면 구문 오류가 발생할 수 있어서
#pass를 넣어서 활용하기도한다
pass
#출력으로 [52, 273, 32.1, 103]이 나오도록 하여라
입력리스트 = ["52", "273", "32.1", "103", "숫자로변환"]
출력리스트 = []
for index in 입력리스트:
try:
출력리스트.append(float(index))
except:
pass
print(출력리스트)
# for 내부에 try에 원래는 if문을 작성해서
# index가 숫자라면 이 작성되어야하는데,
# 정수와 실수가 함께 있어서 생각보다 로직을 떠올리기가 까다롭다.
# 그런데 이렇게 작성하게되었을 경우,
# 협업자나 제 3자가 봤을 때 단번에 이해하기는 어려움이 있다
# 그래서 아래와 같이 함수를 작성한다면
# is float이라는 이름만 보면
# 대충 float인지 확인하는 코드인지 알 수 있다
def isfloat(입력):
try:
float(입력)
return True
except:
return False
입력리스트 = ["52", "273", "32.1", "103", "숫자로변환"]
출력리스트 = []
for index in 입력리스트:
if isfloat(index):
출력리스트.append(float(index))
print(출력리스트)
예외처리의 else finally 구문
try :
pass
except:
pass
else:
pass
finally:
pass
#순서를 지켜줘야한다.
#일반적으로 try-except와 try-except-finally를 많이 활용한다
#else는 사용되지 않는다.
finally 구문
try :
#예외가 발생할 가능성이 있는 코드
숫자입력 = int(input("정수입력> "))
#예외가 발생하지 않았을 때 실행할 코드
print(f"원의 반지름: {숫자입력}")
print(f"원의 둘레: {2 * 3.14 * 숫자입력}")
print(f"원의 넓이: {3.14 * 숫자입력 * 숫자입력}")
except:
#예외가 발생했을 때 실행할 코드
print("정수를 입력하지 않았습니다.")
finally:
#무조건적으로 실행하는 코드
print("무조건 실행되는 코드입니다.")
# 이런식으로 finally는 함수에 들어갔을 때
# return과 관계없이 무조건 실행된다
def 함수():
print("함수()에 진입했습니다.")
try :
print("try 구문에 진입했습니다.")
return
print("try 구문이 끝났습니다.")
except:
print("except 구문에 진입했습니다.")
finally:
print("finally 구문에 진입했습니다")
print("함수()가 끝났습니다")
함수()
# 사용자로부터 파일 이름을 입력 받고
# 그 파일의 내용을 int() 함수로 정수로 변환한 뒤 출력하는 프로그램
def 함수(파일이름):
try:
파일 = open(파일이름, "r")
내용 = 파일.read()
try:
숫자 = int(내용)
return 내용
except:
print("숫자로 변환할 수 없는 파일입니다.")
finally:
파일.close()
except:
print("존재하지 않는 파일입니다.")
파일이름 = input("파일 이름> ")
print(함수(파일이름))
#finally구문은 함수 내부에 사용했을 때 의미를 발휘한다.
#excpet, finally 구문이 예외를 막는 코드는 아니다.
#따라서 except, finally 구문 내부에서 예외가 발생하면 프로그램이 죽는다
# 최종적으로 깔끔하게 정리한다면 이렇게 할 수 있다
def 함수(파일이름):
파일 = None
try:
파일 = open(파일이름, "r")
내용 = 파일.read()
숫자 = int(내용)
return 내용
except ValueError:
print("숫자로 변환할 수 없는 파일입니다.")
except FileNotFoundError:
print("존재하지 않는 파일입니다.")
finally:
if 파일 != None:
파일.close()
파일이름 = input("파일 이름> ")
print(함수(파일이름))
728x90
반응형
댓글