수업(국비지원)/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("프로그램 종료")
  • 다중예외 외의 에러 날때

#TypeError발생 a의 자료형=정수형.

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 # 실행 될 문장이 없는 경우 사용. 일단은 넘어가봐.라는 뜻