ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 예외 처리
    Python 2023. 10. 23. 16:43
    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
Designed by Tistory.