python try except, else finally, 예외 발생시키기, 예외 만들기

yo·2020년 5월 14일
0

예외 처리 사용하기

-예외(exception)란 코드르 실행하는 중에 발생한 에러.
예) 10 /0 하면 오류 발생.(ZeroDivisionError)

try except

문법

try:
   실행할 코드
except:
       예외시 실행할 코드

예시

try:
    x = int(input())
    y = 10 / x
    print(y)
except:
    print('오류 발생')

특정 예외만 처리하기

문법

try:
    실행할 코드
except 예외이름:
     예외시 실행할 코드

예시

y = [10,20,30]

try:
    index, x = map(int, input('인덱스와 나눌 숫자 입력하세요').split
    print(y[index] / x)
except ZeroDivisionError:
      print('숫자를 0으로 나눌 수 없습니다.')
except IndexError:
      print('잘못된 인덱스입니다')

예외의 에러 메세지 받아오기

문법

try:
   실행할 코드
except 예외 as 변수:
     예외가 발생했을 때 처리하는 코드

-보통 변수자리엔 예외(exception)의 e를 따서 e로함.

예시

y = [1,2,3]


try:
    index, x = map(int, input().split())
    print(y[index] / x)
except ZeroDivisionError as e:
    print('숫자를 0으로 나눌 수 없습니다', e)
except IndexError as e:
    print('잘못된 인덱스입니다', e)

-예외가 여러개 발생하면 먼저 발생한 예외의 처리 코드만 실행된다(또는 예외 중 높은 계층의 예외부터 처리됨. 기반 클래스 > 파생 클래스 순서)
-예외 처리는 에러가 발생해도 스크립트의 실행을 중단시키기 않고 계속 실행하고자 할 때 사용

파이썬 예외 계층도

else와 finally 사용하기

-다음과 같이 else는 except 바로 다음에 와야하고 except를 생략할 수 없다.
문법

try:
    실행할 코드
except:
     예외 발생시 실행할 코드
else:
     예외 발생하지 않을 시 실행할 코드

예시

try:
    x = int(input())
    y = 10 / x
except ZeroDivisionError:
    print('숫자를 0으로 나눌 수 없습니다.')
else:
    print(y)

finally 사용

-finally 는 except와 else생략 가능, 예외발생 여부와 상관없이 항상 실행됨
문법

try:
      실행할 코드
except:
      예외 발생시 실행할 코드
else:
      예외 발생하지 않을 때 실행할 코드
finally:
      예외 발생 여부와 상관없이 항상 실행할 코드

예외 발생시키기

문법: raise 예외('에러메세지')

try:
    x = int(input())
    if x % 3 != 0:
        raise Exception('3의 배수가 아닙니다')
    print(x)
except Exception as e:
    print('예외가 발생했습니다', e)
    

raise의 처리과정

-함수 안에서 raise사용하지만 함수 안에 try except가 없는 경우

def three_multiple():
    x = int(input())
    if x % 3 !=0:
        raise Exception('3의 배수가 아닙니다')
    print(x)

try:
    three_multiple()
except Exception as e:
    print("예외가 발생했습니다", e)
  

현재 예외를 다시 발생시키기

except 안에 raise를 사용하면 현재 예외를 다시 발생시킴(re-raise)
-다음은 three_multiple 코드 블록의 예외를 다시 발생시킨 뒤 상위 코드 블록에서 예외를 처리함

def three_multiple():
    try:
       x = int(input('3의 배수 입력하세요'))
       if x % 3 !=0:
          raise Exception('3의 배수가 아닙니다')
       print(x)
    except Exception as e:
        print('three_multiple 함수에서 예외 발생', e)
        raise

try:
    three_multiple()
except Exception as e:
    print("예외가 발생했습니다", e)

예외 만들기 (이해가 잘 안된다)

-사용자 정의 예외: 프로그래머가 직접 만든 예외. 예외에는 내장된 예외와 사용자 정의 예외가 있다.


profile
Never stop asking why

0개의 댓글