[Python] 예외

·2023년 3월 8일
0

[Python] 제로베이스

목록 보기
10/11
post-thumbnail

✒️ 예외 란?

예외란, 문법적인 문제는 없으나 실행 중 발생하는 예상하지 못한 문제

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

Excsptionclass


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


def sub(n1, n2):
    print(n1 - n2)


def mul(n1, n2):
    print(n1 * n2)


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


def calculator(n1, n2):
    add(n1, n2)
    sub(n1, n2)
    mul(n1, n2)
    div(n1, n2)


calculator(10, 0)


📌결과
❗ZeroDivisionError: division by zero

✒️ 예외 처리

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

try ~ except

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


def calculator(n1, n2):
    try:
        add(n1, n2)
        sub(n1, n2)
        mul(n1, n2)
        div(n1, n2)
    except:
        print('예상 하지 못한 예외 발생')



📌결과
10
10
0
예상 하지 못한 예외 발생       
 

✍️실습

사용자로부터 숫자 5개를 입력받을 때 숫자가 아닌 자료형이 입력되면 예외 처리하는 프로그램

nums = []

while True:
    if len(nums) == 5:
        break
    try:
        nums.append(int(input('숫자 입력 : ')))
    except:
        print('숫자를 입력하세요')

print(nums)



📌결과
숫자 입력 : 1
숫자 입력 : hihihi
숫자를 입력하세요
숫자 입력 : 2
숫자 입력 : 안녕
숫자를 입력하세요
숫자 입력 : 1231
숫자 입력 : 21
숫자 입력 : ㄷ
숫자를 입력하세요
숫자 입력 : 4
[1, 2, 1231, 21, 4]

try ~ except ~ else

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


nums = []
n = 1

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

print(nums)


📌결과
슷자 입력 : 10
슷자 입력 : 5
홀수입니다.다시 입력하세요
슷자 입력 : 3
홀수입니다.다시 입력하세요
슷자 입력 : 8
슷자 입력 : 4
슷자 입력 : 하하
예외발생!!
슷자 입력 : 2
슷자 입력 : 6
[10, 8, 4, 2, 6]

✍️실습

사용자로부터 숫자 5개를 입력받아 짝수, 홀수, 실수로 구분해서 각각을 리스트로 저장하는 프로그램
nums = []
evenList = []
oddList = []
floatList = []

while True:
    if len(nums) > 5:
        break
    try:
        nums.append(float(input('input number : ')))
    except:
        print('exception raise!')

    else:
        n = nums[len(nums) - 1]
        if not n.is_integer():
            floatList.append(n)
        elif n % 2 == 0:
            evenList.append(n)
        else:
            oddList.append(n)

print(f'numsLit : {nums}')
print(f'evenList : {evenList}')
print(f'oddList : {oddList}')
print(f'floatList : {floatList}')


📌결과
input number : 0
input number : 1
input number : 5
input number : 실수
exception raise!
input number : float
exception raise!
input number : 14.5
input number : 13.5
input number : 8
numsLit : [0.0, 1.0, 5.0, 14.5, 13.5, 8.0]
evenList : [0.0, 8.0]
oddList : [1.0, 5.0]
floatList : [14.5, 13.5]

final

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

try:
    inputData = input('input number : ')
    numInt = int(inputData)
except:
    print('exception raise!!')
    print('not number')
else:
    if numInt % 2 == 0:
        print('even number!')
    else:
        print('odd number!')

finally:
    print(f'inputData : {inputData}')


📌결과
input number : float
exception raise!!
not number
inputData : float

✍️실습

사용자로부터 숫자 5개를 입력받아 짝수, 홀수, 실수와 입력한 모든 데이터 출력

n = 0
dataList = []
evenList = []
oddList = []
floatList = []

while True:
    if n == 5:
        break

    try:
        data = input('input number : ')
        inputNumber = float(data)

    except:
        print('exception raise!')
        continue
    else:
        n += 1
        if not inputNumber.is_integer():
            floatList.append(inputNumber)
        elif inputNumber % 2 == 0:
            evenList.append(int(inputNumber))
        else:
            oddList.append(int(inputNumber))

    finally:
        dataList.append(data)

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



📌결과
input number : 5
input number : number
exception raise!
input number : 13
input number : 17.5
input number : 8
input number : 10
dataList : ['5', 'number', '13', '17.5', '8', '10']
evenList : [8, 10]
oddList : [5, 13]
floatList : [17.5]

✒️ Exception 클래스

예외 담당 클래스 Exception

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

try:
    print(f'num1 / num2 ={num1 / num2}')
except Exception as e:
    print('0으로 나눌 수 없습니다.')
    print(f'Exception : {e}')

print(f'num1 * num2 = {num1 * num2}')
print(f'num1 + num2 = {num1 + num2}')
print(f'num1 - num2 = {num1 - num2}')


📌결과
input number1 : 5
input number2 : 0
0으로 나눌 수 없습니다.
Exception : division by zero
num1 * num2 = 0
num1 + num2 = 5
num1 - num2 = 5

예외 만들기


def divCalaulator(n1, n2):
    if n2 != 0:
        print(f'{n1} / {n2} : {n1 / n2}')
    else:
        raise Exception('0으로 나눌 수 없습니다.')


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

try:
    divCalaulator(num1, num2)
except Exception as e:
    print(e)



📌결과
input number1 : 10
input number2 : 0
0으로 나눌 수 없습니다.

✍️실습

사용자가 문자 메시지를 보낼때 10글자 이하면 SMS로 발송하고, 10글자를 초과하면 MMS로 발송하는 프로그램을 예외 처리를 이용해서 만들어보자
def sendMessage(message):
    if len(message) <= 10:
        raise Exception(f'10글자 이하 SMS 전환 후 발송 : {message}', 1)
    else:
        raise Exception(f'10글자 초과 MMS 전환 후 발송 : {message}', 2)


message = input('message : ')

try:
    sendMessage(message)
except Exception as e:
    print(e.args[0], " ", e.args[1])


📌결과
message : Hello World!
10글자 초과 MMS 전환 후 발송 : Hello World!   2

사용자 예외 클래스

Exception 클래스를 상속해서 사용자 예외 클래스를 만들 수 있다.


def divCalculator(n1, n2):
    if n2 == 0:
        raise NotUserException(n2)
    else:
        print(f'{n1} / {n2} = {n1 / n2}')


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

try:
    divCalculator(num1, num2)
except Exception as e:
    print(e)


📌결과
num1 : 4
num2 : 0
0() 사용할 수 없습니다.
profile
개발하고싶은사람

0개의 댓글