-
try except로 사용
# try: # 실행할 코드 # except: # 예외가 발생했을 때 처리하는 코드 try: x = int(input('나눌 숫자 입력: ')) y = 10 / x print(y) except: # 예외가 발생했을 때 실행됨 print('오류 발생') # 실행 결과 나눌 숫자 입력: 0 오류 발생
예외 발생 시 해당 줄에서 바로 코드 실행 중단, 바로 except로 넘어가 코드 실행
try의 y = 10 / x, print(y) 모두 실행되지 x
try 코드에서 에러가 발생했을 때만 except 코드가 실행됨
특정 예외만 처리
# try: # 실행할 코드 # except 예외이름: # 예외가 발생했을 때 처리하는 코드 y = [10, 20, 30] try: index, x = map(int, input('인덱스와 나눌 숫자 입력: ').split()) print(y[index] / x) except ZeroDivisionError: # 숫자를 0으로 나눠서 에러가 발생했을 때 실행 print('숫자를 0으로 나눌 수 없음') except IndexError: # 범위를 벗어난 인덱스에 접근하여 에러가 발생했을 때 실행 print('잘못된 인덱스') # 실행 결과 인덱스와 나눌 숫자 입력: 2 0 숫자를 0으로 나눌 수 없음 인덱스와 나눌 숫자 입력: 3 5 잘못된 인덱스 # 위 인덱스는 0, 1, 2까지 존재
예외의 에러 메시지 받아 오기
# try: # 실행할 코드 # except 예외 as 변수: # 예외가 발생했을 때 처리하는 코드 y = [10, 20, 30] try: index, x = map(int, input('인덱스와 나눌 숫자 입력: ').split()) print(y[index] / x) except ZeroDivisionError as e: # as 뒤에 변수를 지정하면 에러를 받아 옴 print('숫자를 0으로 나눌 수 없음', e) # e에 저장된 에러 메시지 출력 except IndexError as e: print('잘못된 인덱스입니다', e) # 실행 결과 인덱스와 나눌 숫자 입력: 2 0 숫자를 0으로 나눌 수 없음 division by zero 인덱스와 나눌 숫자 입력: 3 5 잘못된 인덱스입니다 list index out of range
모든 예외의 에러 메시지 출력할 때 Exception 사용
except Exception as e: print('예외가 발생했습니다', e)
else와 finally 사용
# try: # 실행할 코드 # except: # 예외가 발생했을 때 처리하는 코드 # else: # 예외가 발생하지 않았을 때 실행할 코드 # else는 except 바로 다음에 와야 하며 except 생략 불가능 try: x = int(input('나눌 숫자 입력: ')) y = 10 / x except ZeroDivisionError: print('숫자를 0으로 나눌 수 없음') else: print(y) # 실행 결과 나눌 숫자 입력: 2 5.0 나눌 숫자 입력: 0 숫자를 0으로 나눌 수 없음
예외와 상관없이 항상 코드 실행
# try: # 실행할 코드 # except: # 예외가 발생했을 때 처리하는 코드 # else: # 예외가 발생하지 않았을 때 실행할 코드 # finally: # 예외 발생 여부와 상관없이 항상 실행할 코드 # finally는 except와 else를 생략할 수 있음 try: x = int(input('나눌 숫자 입력: ')) y = 10 / x except ZeroDivisionError: print('숫자를 0으로 나눌 수 없음') else: print(y) finally: print('코드 실행이 끝났습니다') # 실행 결과 나눌 숫자 입력: 2 5.0 코드 실행이 끝났습니다 나눌 숫자 입력: 0 숫자를 0으로 나눌 수 없음 코드 실행이 끝났습니다
예외 발생시키기
# raise 예외('에러메시지') try: x = int(input('3의 배수 입력: ')) if x % 3 != 0: # x가 3의 배수가 아니면 raise Exception('3의 배수가 아닙니다') # 예외를 발생시킴 print(x) except Exception as e: # 예외가 발생했을 때 실행됨 print('예외 발생', e) # 실행 결과 3의 배수 입력: 3 3 3의 배수 입력: 1 예외 발생 3의 배수가 아닙니다
raise의 처리 과정
def three_multiple(): x = int(input('3의 배수 입력: ')) if x % 3 != 0: raise Exception('3의 배수가 아님') # x가 3의 배수가 아니면 예외 발생 print(x) # 현재 함수 안에 except가 없으므로 # 예외를 상위 코드 블록으로 넘김 try: three_multiple() except Exception as e: # 하위 코드 블록에서 예외가 발생해도 실행됨 print('예외 발생', e) # 실행 결과 3의 배수 입력: 5 예외 발생 3의 배수가 아님
three_multiple 함수는 안에 try except가 없는 상태에서 raise로 예외 발생, 이렇게 되면 함수 바깥에 있는 except에서 예외 처리
예외가 발생하더랃 현재 코드 블록에서 처리해 줄 except가 없다면 except가 나올 때까지 계속 상위 코드 블록으로 올라감
함수 바깥에도 처리해 줄 except가 없다면 코드 실행 중지, 에러 표시
현재 예외 다시 발생시키기
try except에서 처리한 예외를 다시 발생시킴
except 안에서 raise를 사용하면 현재 예외 다시 발생시킴 (re-raise)
def three_multiple(): try: x = int(input('3의 배수 입력: ')) if x % 3 != 0: raise Exception('3의 배수가 아님') # x가 3의 배수가 아니면 예외 발생 print(x) except Exception as e: # 함수 안에서 예외 처리 print('three_multiple 함수에서 예외 발생', e) raise # raise로 현재 예외를 다시 발생시켜 상위 코드 블록으로 넘김 try: three_multiple() except Exception as e: # 하위 코드 블록에서 예외가 발생해도 실행됨 print('스크립트 파일에서 예외 발생', e) # 실행 결과 3의 배수 입력: 5 three_multiple 함수에서 예외 발생 3의 배수가 아님 스크립트 파일에서 예외 발생 3의 배수가 아님
예외 만들기
# class 예외이름(Exception): # def __init__(self): # super().__init__('에러메시지') class NotThreeMultipleError(Exception): # Exception을 상속받아 새로운 예외를 만듦 def __init__(self): super().__init__('3의 배수가 아님') def three_multiple(): try: x = int(input('3의 배수 입력: ')) if x % 3 != 0: # x가 3의 배수가 아니면 raise NotThreeMultipleError # NotThreeMultipleError 예외를 발생시킴 print(x) except Exception as e: print('예외 발생', e) three_multiple() # 실행 결과 3의 배수 입력: 5 예외 발생 3의 배수가 아님
'Python' 카테고리의 다른 글
제너레이터(발생자) (0) 2023.10.24 이터레이터(반복자) (0) 2023.10.24 클래스(3) (0) 2023.10.23 클래스(2) (0) 2023.10.18 클래스(1) (0) 2023.10.18