예외처리

Jane의 study note.·2022년 10월 1일
0

파이썬 Python

목록 보기
23/31
post-thumbnail

링크:예외처리

1. 예외란?

예상하지 못한 문제로 프로그램 실행이 어려운 상태

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)


firstNum = int(input('first number: '))
secondNum = int(input('second number: '))

add(firstNum, secondNum)
sub(firstNum, secondNum)
mul(firstNum, secondNum)
div(firstNum, secondNum)

예외 종류


# ZeroDivisionError: division by zero
print(10 / 0)

# ValueError: invalid literal for int() with base 10: 'Hello'
int('Hello')

# IndexError: list index out of range
tempList = [1, 2, 3, 4, 5]
print(tempList[0])
print(tempList[1])
print(tempList[2])
print(tempList[3])
print(tempList[4])
print(tempList[5])

# IndentationError: unexpected indent
# if 10 <= 20:
#     print('result: ', end='')
        # print('10 <= 20')

# FileNotFoundError: [Errno 2] No such file or directory: 'c:/python/test.txt'
file = open('c:/python/test.txt', 'r')
----------
# 예외 처리
try:
    print(10 / 0)
except:
    print('예외 발생!! 예외 확인 하세요.')

2. 예외처리

발생된 예외를 별도 처리함으로써 프로그램 전체의 실행에 문제가 없도록 함.

예외 처리

try ~ except

n1= 10; n2 = 0

print(n1 / n2)
print(n1 * n2)
print(n1 - n2)
print(n1 + n2)

------
n1= 10; n2 = 0

try:
    print(n1 / n2)
except:
    print('예상치 못한 예외가 발생했습니다.')
    print('다른 프로그램 실행에는 문제 없습니다.')

print(n1 * n2)
print(n1 - n2)
print(n1 + n2)

실습

nums = []

n = 1
while n < 6:
    try:
        num = int(input('input number: '))
    except:
        print('예외 발생!')
        continue

    nums.append(num)
    n += 1

print(f'nums: {nums}')

3. try ~ except ~ else

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

~ 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('입력한 숫자는 홀수 입니다.', end='')
            print('다시 입력 하세요.')
            continue


print(f'nums: {nums}')

실습


eveList = []; oddList = []; floatList = []

n = 1
while n < 6:

    try:
        num = float(input('input number: '))

    except:
        print('exception raise!!')
        print('input number again!!')
        continue

    else:

        if num - int(num) != 0:
            print('float number!')
            floatList.append(num)
        else:
            if num % 2 == 0:
                print('even number!')
                eveList.append(int(num))

            else:
                print('odd number')
                oddList.append(int(num))

        n += 1

print(f'eveList: {eveList}')
print(f'oddList: {oddList}')
print(f'floatList: {floatList}')

4. finally

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

finally

try:
    inputData = input('input number: ')
    numInt = int(inputData)

except:
    print('exception raise!!')
    print('not number!!')
    numInt = 0

else:
    if numInt % 2 == 0:
        print('inputData is even number!!')
    else:
        print('inputData is odd number!!')

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

실습


eveList = []; oddList = []; floatList = []
dataList = []

n = 1
while n < 6:

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

    except:
        print('exception raise!!')
        print('input number again!!')
        continue

    else:

        if floatNum - int(floatNum) != 0:
            print('float number!')
            floatList.append(floatNum)
        else:
            if floatNum % 2 == 0:
                print('even number!')
                eveList.append(int(floatNum))

            else:
                print('odd number')
                oddList.append(int(floatNum))

        n += 1

    finally:
        dataList.append(data)


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

5. Exception 클래스

Exception은 예외를 담당하는 클래스이다.

Exception

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

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

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




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

try:
    print(f'num1 / num2 = {num1 / num2}')
except Exception as e:
    print(f'exception: {e}')

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

try:
    num1 = int(input('input numer1: '))
    num2 = int(input('input numer2: '))
except Exception as e:
    print(f'exception: {e}')
    num1 = 10
    num2 = 20

try:
    print(f'num1 / num2 = {num1 / num2}')
except ZeroDivisionError as e:
    print(f'exception: {e}')

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

raise

def divCalculator(n1, n2):

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


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

try:
    divCalculator(num1, num2)
except Exception as e:
    print(f'Exception: {e}')

실습

def sendSMS(msg):

    if len(msg) > 10:
        raise Exception('길이 초과!! MMS전환 후 발송!!', 1)

    else:
        print('SMS 발송!!')

def sendMMS(msg):

    if len(msg) <= 10:
        raise Exception('길이 미달!! SMS전환 후 발송!!', 2)
    else:
        print('MMS 발송!!')


msg = input('input message: ')

try:
    sendSMS(msg)

except Exception as e:
    print(f'e: {e.args[0]}')
    print(f'e: {e.args[1]}')

    if e.args[1] == 1:
        sendMMS(msg)
    elif e.args[1] == 2:
        sendSMS(msg)

6. 사용자 Exception 클래스

예외 클래스를 직접 만들어보자!

사용자 예외 클래스

class NotUseZeroException(Exception):

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


def divCalculator(num1, num2):

    if num2 == 0:
        raise NotUseZeroException(num2)
    else:
        print(f'{num1} / {num2} = {num1 / num2}')

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

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

실습


class PasswordLengthShortException(Exception):

    def __init__(self, str):
            super().__init__(f'{str}: 길이 5미만!!')

class PasswordLengthLongException(Exception):

    def __init__(self, str):
            super().__init__(f'{str}: 길이 10초과!!')

class PasswordWrongException(Exception):

    def __init__(self, str):
            super().__init__(f'{str} 잘못된 비밀번호!!')



adminPw = input('input admin password: ')

try:
    if len(adminPw) < 5:
        raise PasswordLengthShortException(adminPw)

    elif len(adminPw) > 10:
        raise PasswordLengthLongException(adminPw)

    elif adminPw != 'admin1234':
        raise PasswordWrongException(adminPw)

    elif adminPw == 'admin1234':
        print('빙고!')

except PasswordLengthShortException as e1:
    print(e1)

except PasswordLengthLongException as e2:
    print(e2)

except PasswordWrongException as e3:
    print(e3)

# 변수를 선언합니다.
list_number = [52, 273, 32, 72, 100]

# try except 구문으로 예외를 처리합니다.
try:
    # 숫자를 입력 받습니다.
    number_input = int(input("정수 입력> "))
    # 리스트의 요소를 출력합니다.
    print("{}번째 요소: {}".format(number_input, list_number[number_input]))
    예외.발생해주세요()
except ValueError as exception:
    # ValueError가 발생하는 경우
    print("정수를 입력해 주세요!")
    print(type(exception), exception)
except IndexError as exception:
    # IndexError가 발생하는 경우
    print("리스트의 인덱스를 벗어났어요!")
    print(type(exception), exception)
except Exception as exception:
    # 이외의 예외가 발생한 경우
    print("미리 파악하지 못한 예외가 발생했습니다.")
    print(type(exception), exception)

0개의 댓글