중급 파이썬 Part 4 - 예외처리

2023. 3. 15. 16:21카테고리 없음

# 28강 예외란? 

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

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

 < 예외 종류 >

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

 

#29강. 예외처리

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

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

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

nums = []

n= 1
while n<6:
    try:
        num = int(input('input number: '))

    except:
        print('예외 발생')
        continue


    nums.append(num)
    n += 1

print(f'nums : {nums}')

# 30강. try~except ~ else

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

nums = []
n = 1
while n < 6:

    try:
        num = int(input('input number:'))   # try~

    except:                                 # 예외(오류)일경우
        print('예외 발생')
        continue

    else:                                   # 예외가 발생하지 않은 경우
        if num % 2 ==0:
            nums.append(num)
            n+=1

        else:
            print('홀수입니다.', end='')
            print('다시입력하세요')
            continue

print(f'nums: {nums}')

▶ Q) 사용자로부터 숫자 5개를 입력받아 짝수, 홀수, 실수로 구분해서 각각을 리스트에 저장하는 프로그램을 만들어보자.

even_list = []; odd_list=[]; float_list=[]

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')
            float_list.append(num)

        else:
            if num % 2 == 0:
                print('even number')
                even_list.append(int(num))
            else:
                print('odd number')
                odd_list.append(int(num))

            n += 1

print(f'even_list: {even_list}')
print(f'odd_list: {odd_list}')
print(f'float_list: {float_list}')

#31강. finally : 예외 발생과 상관없이 항상 실행한다.

▶ 사용자로부터 숫자 5개를 입력받아 짝수, 홀수, 실수와 입력한 모든 데이터를 각각 출력하는 프로그램을 만들어보자.

even_list = []; odd_list=[]; float_list=[]; data_list = []

n = 1
while n < 6:

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

    except:
        print(' exception raise!!')
        print(' not number !!')
        continue

    else:
        if float_num - int(float_num) != 0:
            print('float number')
            float_list.append(float_num)

        else:
            if float_num % 2 == 0:
                print('even number')
                even_list.append(float_num)
            else:
                print('odd number')
                odd_list.append(float_num)

        n += 1

    finally:
        data_list.append(data)

print(f'even_list: {even_list}')
print(f'odd_list: {odd_list}')
print(f'float_list: {float_list}')
print(f'data_list: {data_list}')

 

# 32강. Exception 클래스

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

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

def divCalculator(n1,n2):

    if n2 != 0:
        print(f'{n1}/{n2} = {n1/n2}')

    else:
        raise Exception('0으로 나눌 수 없습니다.')

num1 = int(input('input number 1: '))
num2 = int(input('input number 2: '))

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

▶ 사용자가 문자 메세지를 보낼 때 10글자 이하면 sms로 발생하고, 10글자를 초과하면 mms로 발송하는 프로그램을 예외 처리를 이용해서 만들어보자

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

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

msg = input('input message : ')

try:
    send_SMS(msg)

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

    if e.args[1] == 1:
        send_MMS(msg)

    elif e.args[1] == 2:
        send_SMS(msg)

# 33강. 사용자 예외 클래스

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

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

class Not_Use_Zero_Exception(Exception):

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

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

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

try:
    div_Calculator(num1,num2)
except Not_Use_Zero_Exception as e:
    print(e)

▶ Q) 관리자 암호를 입력하고 다음 상태에 따라 예외처리하는 예외 클래스를 만들어 보자

암호길이가 5미만인 경우 / 암호 길이가 10을 초과하는 경우 / 암호가 잘못된 경우

class PasswordLength_Short_Exception(Exception):

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

class PasswordLength_Long_Exception(Exception):

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

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

adminPW = input('input admin password : ')

try:
    if len(adminPW) <5 :
        raise PasswordLength_Short_Exception(adminPW)
    elif len(adminPW) > 10:
        raise PasswordLength_Long_Exception(adminPW)
    elif adminPW != 'admin1234':
        raise Password_Wrong_Exception(adminPW)
    elif adminPW == 'admin1234':
        print('빙고!!')

except PasswordLength_Short_Exception as e1:
    print(e1)

except PasswordLength_Long_Exception as e2:
    print(e2)

except Password_Wrong_Exception as e3:
    print(e3)