Language/Python

[Python] 예외

Sh-YE 2024. 6. 4. 14:37

예외란?

문법적인 문제는 없으나 실행 중 발생하는 예상하지 못한 문제이다.

(문법적인 문제가 있으면 에러)

ex) 10 / 0 -> ZeroDivisionError

def add(n1,n2):
    print(n1+n2)
def div(n1,n2):
    print(n1/n2)

fn = int(input('input firstNum : '))
sn = int(input('input secondNum : '))

add(fn,sn)
div(fn,sn)

>>>
10
ZeroDivisionError: division by zero

 

 

예외관련 클래스는 Exception 클래스를 상속한다.

출처: 제로베이스

예외처리

예상하지못한 예외가 프로그램 전체 실행에 영향이 없도록 처리.

 

1) try ~ except

예외 발생 예상 구분을 try ~ except로 감싼다.

def add(n1,n2):
    print(n1+n2)
def div(n1,n2):
    try:
        print(n1/n2)
    except:
        print('예상치 못한 문제가 발생했습니다.')
fn = int(input('input firstNum : '))
sn = int(input('input secondNum : '))

add(fn,sn)
div(fn,sn)

>>>
input firstNum : 10
input secondNum : 0
10
예상치 못한 문제가 발생했습니다.

 

 

1-1) try ~ except ~ else

예외 발생 예상 구분을 try ~ except로 감싼다.

else : 예외가 발생하지 않은 경우 실행하는 구문.

nums = []
n = 1
while n < 6:
    try:
        num = int(input('input Number : '))
    except:
        print('예외발생!')
        continue
    else:
        if num % 2 == 0:
            nums.append(num)
            n += 1
        else:
            print('홀수입니다. 다시 입력하세요')
print(nums)

 

1-2) finally

예외발생과 상관없이 항상 실행.

evenList = []; oddList = []; floatList = []; dataList = []

n = 1
while n < 6:
    try:
        data = input('숫자 입력 : ')
        floatnum = float(data)
    except:
        print('예외발생!')
        continue
    else:
        if floatnum - int(floatnum) != 0:
            print('float number')
            floatList.append(floatnum)
        else:
            if floatnum % 2 == 0:
                print('even number!')
                evenList.append(int(floatnum))
            else:
                print('odd number')
                oddList.append(int(floatnum))

        n += 1

    finally:
        dataList.append(data)


print(f'evenList: {evenList}')
print(f'oddList:{oddList}')
print(f'floatList:{floatList}')
print(f'dataList:{dataList}')

 

2) 예외담당 클래스 Exception 

def add(n1,n2):
    print(n1+n2)
def div(n1,n2):
    try:
        print(n1/n2)
    except Exception as e:
        print(f'exception: {e}')
fn = int(input('input firstNum : '))
sn = int(input('input secondNum : '))

add(fn,sn)
div(fn,sn)

>>>
input firstNum : 10
input secondNum : 0
10
exception: division by zero

 

3) raise

raise 키워드를 이용하면, 예외를 발생시킬 수 있다.

def div(n1,n2):
    if n2 != 0:
        print(n1/n2)
    else:
      # n2가 0이 아닐경우, 강제로 예외발생시킴
        raise Exception('0으로 나눌 수 없습니다.')
fn = int(input('input firstNum : '))
sn = int(input('input secondNum : '))
try:
    div(fn,sn)
except Exception as e:
    print(f'exception: {e}')
    
>>>
input firstNum : 10
input secondNum : 0
exception: 0으로 나눌 수 없습니다.

 

4) 사용자 예외 클래스

class NotUseZeroExcepton(Exception):
    def __init__(self,n):
        super().__init__(f'{n}은 사용할 수 없습니다.')

def divCalculator(num1,num2):
    if num2 == 0:
        raise NotUseZeroExcepton(num2)
    else:
        print(f'{num1} / {num2} = {num1 /num2 }')

num1 = int(input('input number1 : '))
num2 = int(input('input number2 : '))

try:
    divCalculator(num1,num2)
except NotUseZeroExcepton as e:
    print(e)
    
>>>
input number1 : 10
input number2 : 0
0은 사용할 수 없습니다.