수업(국비지원)/Python
[Python] 예외 처리
byeolsub
2023. 4. 24. 20:37
# 오류 종류에 상관 없이 오류가 발생하면 except블록 수행
try :
.....
except :
....
# 발생된 오류가 except 문에 미리 정해 놓은 오류이름과 일치할때만 excpet 블록 수행
try :
....
except 발생오류 :
....
# 오류 메세지 이름까지 알고 싶을 때 사용
try :
....
except 발생오류 as 오류메세지 변수
# try ...finally 구문 :
try문 수행 도중 예외 발생 여부에 상관 없이 항상 수행된다.
try :
....
finally :
....
📌
################# 예외처리 : 예측가능한 오류 발생 시 정상 처리
# try : except 문장
idx = "파이썬".index("일") # 오류 발생
idx = "파이썬".find("일") # 결과 -> -1
idx
# 예외처리 하기
try :
idx = "파이썬".index("일") # 예외 발생
print(idx)
except :
print("파이썬 글자에는 '일'자가 없습니다.")
📌
# mystr 문자열에 파이썬 문자의 위치를 strpos 리스트에 저장하기
mystr = "파이썬 공부 중입니다. 파이썬을 열심히 공부합시다."
#1
strpos = []
index = 0
while True :
index = mystr.find("파이썬",index) # index 이후부터 검색
if index < 0 : # 찾을 수 없다.
break
strpos.append(index) # 0
index += 1
print(strpos) # 결과 -> [0, 13]
#2 예외처리를 이용한 방식
# index 함수 사용. 예외처리
strpos = []
index = 0
while True :
try :
index = mystr.index("파이썬",index)
strpos.append(index) # 0
index += 1
except : # 오류 발생시 호출되는 영역
break
print(strpos) # 결과 -> [0, 13]
📌 다중예외 처리 : 하나의 try 구문에 여러개의 except 구문이 존재하는 경우 예외별로 다른 처리 가능
- 다중 예외 처리 전(일반적인 예외 처리 구문)
# 다중예외 처리 : 하나의 try 구문에 여러개의 except 구문이 존재하는 경우
# 예외별로 다른 처리 가능
num1 = input("숫자형 데이터1 입력: ")
num2 = input("숫자형 데이터2 입력: ")
try :
n1 = int(num1)
n2 = int(num2)
print(n1+n2)
print(n1/n2)
except :
print("오류발생")
- 다중 예외 처리
# 다중예외 처리 : 하나의 try 구문에 여러개의 except 구문이 존재하는 경우
# 예외별로 다른 처리 가능
num1 = input("숫자형 데이터1 입력: ")
num2 = input("숫자형 데이터2 입력: ")
try :
n1 = int(num1)
n2 = int(num2)
print(n1+n2)
print(n1/n2)
except ValueError as e:
print("숫자로 변환할 수 없습니다.")
print(e)
except ZeroDivisionError as e :
print("두번째 숫자는 0이 불가능 합니다.")
print(e)
finally : # 자바의 finally와 동일. 정상이든 예외든 모두 실행되는 문장(구문)
print("프로그램 종료")
- 다중예외를 하나로 묶기
num1 = input("숫자형 데이터1 입력: ")
num2 = input("숫자형 데이터2 입력: ")
try :
n1 = int(num1)
n2 = int(num2)
print(n1+n2)
print(n1/n2)
except (ValueError,ZeroDivisionError) as e:
print("입력 오류")
print(e)
finally : # 자바의 finally와 동일. 정상이든 예외든 모두 실행되는 문장(구문)
print("프로그램 종료")
- 다중예외 외의 에러 날때
num1 = input("숫자형 데이터1 입력: ")
num2 = input("숫자형 데이터2 입력: ")
try :
#TypeError발생 a의 자료형=정수형.
print(a[0]) #Value,Zero 에러 둘다 아닐때
n1 = int(num1)
n2 = int(num2)
print(n1+n2)
print(n1/n2)
except (ValueError,ZeroDivisionError) as e:
print("입력 오류")
print(e)
finally : # 자바의 finally와 동일. 정상이든 예외든 모두 실행되는 문장(구문)
print("프로그램 종료")
❓ 나이를 입력받아 19세 미만이면 미성년, 19세이상이면 성인 출력. 입력된 데이터가 숫자가 아니면 숫자만 입력하세요 메세지 출력.
#1-1
try :
age = int(input("나이를 입력하세요.: "))
if age < 19 :
print("미성년자입니다.")
else :
print("성인입니다.")
except ValueError as e:
print("숫자만 입력하세요.")
print(e)
#1-2. 강사님 코드
try :
age = int(input("나이를 입력하세요.: "))
if age < 19 :
print(age,":미성년자입니다.")
elif age >= 19 :
print(age,":성인입니다.")
except ValueError as e:
print("숫자만 입력하세요.")
print(e)
#2
# else 블럭 : 오류 발생이 안된 경우 실행되는 블럭
try : # try 블럭에서 오류 발생시 except블럭으로 이동
age = int(input("나이를 입력하세요.: "))
except :
print("숫자만 입력하세요.")
else : # 정상적인 경우 실행되는 블럭
if age < 19 :
print("미성년자입니다.")
elif age >= 19 :
print("성인입니다.")
#실패코드 왜?
#age정의가 try 안에있어야 오류안남.
age = input("나이를 입력하세요. :")
try :
age = int(age)
if age < 19 :
print("미성년 입니다.")
else :
print("성인 입니다. ")
except ValueError as e:
print("숫자만 입력하세요.")
print(e)
📌
# raise : 예외 강제 발생
try :
print(1)
raise ValueError
print(2)
except ValueError :
print("ValueError 강제 발생")
# pass 예약어 : 블럭 내부에 실행 될 문장이 없는 경우
n = 11
if n > 10 :
pass
else :
print("n의 값은 10 이하 입니다.")
n = 9
if n > 10 :
pass
else :
print("n의 값은 10 이하 입니다.")
try :
age = int(input("나이를 입력하세요.: "))
if age < 19 :
print("미성년자입니다.")
else :
print("성인입니다.")
except ValueError :
pass # 오류 발생시 무시
def dumy() :
pass # 실행 될 문장이 없는 경우 사용. 일단은 넘어가봐.라는 뜻