파이썬 기초 - 중급06

hs0820·2023년 6월 9일

파이썬

목록 보기
9/16
post-thumbnail

📝 파이썬 기초 - 중급06

📌 예외

✏ 예외 란?

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

  • 예외 종류
    - 예외 관련 클래스는 Exception 클래스를 상속한다.

exception

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

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


fn = int(input('first number :'))
sn = int(input('last number :'))

# first number :10
# last number :0
add(fn, sn)10

div(fn, sn)
↓
ZeroDivisionError: division by zero <= error

✏ 예외 처리

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

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

n1 = 10; n2 = 0

try:
    print(n1 / n2)
except:
    print('예상치 못한 문제가 발생했습니다.')
    print('다음으로 넘어갑니다.')
    
print(n1 * n2)
print(n1 + n2)
print(n1 - n2)
↓
예상치 못한 문제가 발생했습니다.
다음으로 넘어갑니다.
0
10
10
nums = []

n = 0

while n < 5 :
    try:
        getNum = int(input('숫자를 입력하세요 :'))
    except:
        print('입력 오류, 다시 입력하세요.')
        continue

    nums.append(getNum)
    n += 1

print(f'input number : {nums}')
↓
숫자를 입력하세요 :1
숫자를 입력하세요 :d
입력 오류
숫자를 입력하세요 :2
숫자를 입력하세요 :6
숫자를 입력하세요 :10
숫자를 입력하세요 :w
입력 오류
숫자를 입력하세요 :11
input number : [1, 2, 6, 10, 11]

✏ try ~ except ~ else

  • ~else
    - 예외가 발생하지 않은 경우 실행하는 구문이다.
    • 예외가 발생할 때만 try ~ except 사용 시 생략 가능
evenList = []; oddList = []; floatList = []

n = 0

while n < 5:

    try:
        getNum = float(input('숫자를 입력하세요(실수 가능) :'))

    except:
        print('입력 오류(예외 발생)')
        continue

    else:
        intNum = int(getNum)

        if getNum - intNum != 0 :
            floatList.append(getNum)
        elif getNum % 2 == 0 :
            evenList.append(intNum)
        else:
            oddList.append(intNum)

    n += 1

print(floatList)
print(evenList)
print(oddList)
↓
숫자를 입력하세요(실수 가능) :2.1
숫자를 입력하세요(실수 가능) :w
입력 오류(예외 발생)
숫자를 입력하세요(실수 가능) :3
숫자를 입력하세요(실수 가능) :2
숫자를 입력하세요(실수 가능) :6
숫자를 입력하세요(실수 가능) :5
[2.1]
[2, 6]
[3, 5]

✏ finally

  • 예외 발생과 상관없이 항상 실행한다.
oddList = []; evenList = []; floatList = []; dataList = []

n = 0

while n < 5 :

    try:
        getNum = input('숫자를 입력하세요(실수 가능) :')
        floatNum = float(getNum)
        intNum = int(floatNum)

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

    else:
        if floatNum - intNum != 0 :
            floatList.append(floatNum)

        elif intNum % 2 == 0 :
            evenList.append(intNum)

        else:
            oddList.append(intNum)

    finally:
        dataList.append(getNum)

    n += 1

def printList() :
	print(f'oddList : {oddList}')
    print(f'evenList : {evenList}')
    print(f'floatList : {floatList}')
    print(f'dataList : {dataList}')
    print(f'getNum type : {type(getNum)}')
    print(f'floatNum type : {type(floatNum)}')
    print(f'intNum type : {type(intNum)}')



printList()
↓
숫자를 입력하세요(실수 가능) :a
오류(예외 발생)
숫자를 입력하세요(실수 가능) :abcd
오류(예외 발생)
숫자를 입력하세요(실수 가능) :1
숫자를 입력하세요(실수 가능) :2
숫자를 입력하세요(실수 가능) :3
숫자를 입력하세요(실수 가능) :2.11
숫자를 입력하세요(실수 가능) :5
oddList : [1, 3, 5]
evenList : [2]
floatList : [2.11]
dataList : ['a', 'abcd', '1', '2', '3', '2.11', '5']
getNum type : <class 'str'>
floatNum type : <class 'float'>
intNum type : <class 'int'>

✏ Exception

  • 예외 담당 클래스 Exception
num1 = int(input('숫자 입력 :'))
num2 = int(input('숫자 입력 :'))


def cal() :
    try:
        print(f'나누기 : {num1 / num2}')
    except Exception as e:
        print(f'exception : {e}')
        print('계산 오류')

    print(f'더하기 : {num1 + num2}')
    print(f'곱하기 : {num1 * num2}')


cal()
↓
숫자 입력 :10
숫자 입력 :0
exception : division by zero
계산 오류
더하기 : 10
곱하기 : 0
  • raise 키워드를 이용하면 예외를 발생시킬 수 있다.
def sendSMS(msg):
    if len(msg) > 10 :
        raise Exception('10글자를 초과하여 MMS로 전환하여 전송합니다.', 1)
    else:
        print('SMS 발송 완료.')

def sendMMS(msg):
    if len(msg) <= 10 :
        raise Exception('10글자 이하로 SMS로 전환하여 전송합니다.', 2)
    else:
        print('MMS 발송 완료.')

msg = input('문자를 입력하세요. : ')

try:
    sendSMS(msg)

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

    if e.args[1] == 1 :
        sendMMS(msg)
    elif e.args[1] == 2 :
        sendSMS(msg)
↓
문자를 입력하세요. : mms 문자를 발송하기 위해 10글자 이상 작성
Exception: 10글자를 초과하여 MMS로 전환하여 전송합니다.
Exception: 1
MMS 발송 완료.

↓
문자를 입력하세요. : 10글자 이하
SMS 발송 완료.

✏ 사용자 예외 클래스

  • Exception 클래스를 상속해서 사용자 예외 클래스를 만들 수 있다.
class NotUseException(Exception):
    def __init__(self, num):
        super().__init__(f'{num} 은(는) 사용할 수 없습니다.')

def cal(num1, num2) :

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

n1 = int(input('first num :'))
n2 = int(input('last num :'))

try:
    cal(n1, n2)
except NotUseException as e :
    print(f'e : {e}')
↓
first num :10
last num :2
10 / 2 = 5.0


↓
first num :10
last num :0
e : 0() 사용할 수 없습니다.
class PasswordLengthShortException(Exception) :
    def __init__(self, n):
        super().__init__(f'{n} : 길이 5 미만')


class PasswordLengthLongException(Exception):
    def __init__(self, n):
        super().__init__(f'{n} : 길이 10 초과')


class PasswordWrongException(Exception):
    def __init__(self, n):
        super().__init__(f'{n} : 잘못된 비밀번호입니다.')

def getPassword(pw) :
    pwLen = len(pw)

    if pwLen < 5 :
        raise PasswordLengthShortException(pw)
    elif pwLen > 10 :
        raise PasswordLengthLongException(pw)
    elif pw != 'admin1234' :
        raise PasswordWrongException(pw)
    elif pw == 'admin1234' :
        print(f'비밀번호 : {pw}')
        print('비밀번호 입력 완료')

pw = input('비밀번호를 입력하세요. : ')

try:
    getPassword(pw)
except PasswordLengthShortException as e1 :
    print(e1)

except PasswordLengthLongException as e2 :
    print(e2)

except PasswordWrongException as e3 :
    print(e3)
↓
비밀번호를 입력하세요. : 1234
1234 : 길이 5 미만

↓
비밀번호를 입력하세요. : 123456789
123456789 : 잘못된 비밀번호입니다.

↓
비밀번호를 입력하세요. : sllekfms120340
sllekfms120340 : 길이 10 초과

↓
비밀번호를 입력하세요. : admin1234
비밀번호 : admin1234
비밀번호 입력 완료

📢 오늘의 한마디
초급 강의를 통해 헷갈렸던 부분을 다시 짚어 가면서
중급 강의를 통해 파이썬 기초를 다지는 중이다..
요 며칠 실습을 집중으로 여러가지 코드들을 혼자 짜보면서 공부하느라
중급 강의 진도가 더뎠지만 지식을 쌓는 데에는 큰 도움이 된 것 같다.
앞으로도 속도 보다는 제대로 된 지식을 쌓는데 집중해야지..

profile
개발 스터디 노트

0개의 댓글