[Zerobase][Python Mid] 예외처리

솔비·2023년 12월 1일
0

💻 Python. w/zerobase

목록 보기
12/33
post-thumbnail

파이썬중급 [예외처리]

오늘의 주저리주저리
어제 퇴사기념 팀 회식을 하고왔다.
숙취와 함께하는 예외공부 스타또


1. 예외란?

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

#ZeroDivisionError
def div(n1,n2) :
     print(n1/n2)
n1 = 10
n2 = 0
div(n1,n2)            [어떠한 경우에도 0으로 나눌 수 없음]
#ValueError
print(int('hello'))   [hello는 str으로 int로 형변환 할 수 없음]
#IndexError
list = [1,2,3]
print(list[3])        [3번째 오는 숫자 없음]

2. 예외처리

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

A. try : ~ except :

try : [실행문] except : [error일때 실행문]

#예시1
n1=10
n2=0

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

print(n1*n2)                                #0
print(n1+n2)								#10
print(n1-n2)								#10
#예시2
nums = []

n=1
while n < 6 :
    try:
        num = int(input('input number : '))
    except :
        print('예외발생')			   #[문자열이 들어왔을때 발생]
        continue					   #[*continum : 다음실행문으로 넘어가세요]

    nums.append(num)				#[*append : nums에 num 값을 차례대로 붙혀주는함수]
    n += 1

print(f'num : {nums}')

B. try : ~ except : ~else :

try : [실행문 ] except : [error일때 실행문] else : [error아닐때 실행문]

예시1.

nums = []

n=1
while n < 6 :

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

    except :
        print('예외발생')				#[문자열이 들어왔을 때 출력]
        continue						#[*continum : 다음실행문으로 넘어가세요]

    else :								#[오류가 아닐때 출력]
        if num % 2 == 0 :
            nums.append(num)			#[*append : nums에 num 값을 차례대로 붙혀주는함수]
            n += 1

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

print(nums)

C. finally

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

업로드중..

try :
    input_data = input('input number : ')
    num_int = int(input_data)					#예외발생시점

except :
    print('exception raise')					#오류일 경우 출력문
    print('not number !')

else :											#오류가 아닐때 출력문
    if num_int % 2 == 0 :						
        print('input data is even number')
    else :
        print('inpute data is odd number')

finally:
    print(f'input_data : {input_data}')			#try에서 input한 모든 데이터(error)도 출력

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

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


even_list = []
odd_list = []
float_list = []
all_list = []

n = 1
while n < 6:

    try:
        user_num = input('숫자입력 : ')
        float_user_num = float(user_num)

    except :
        print('Exception raise')
        continue

    else :
        if float_user_num - int(float_user_num) != 0 :
            float_list.append(user_num)
        else :
            if float_user_num % 2 == 0 :
                even_list.append(user_num)
            else :
                odd_list.append(user_num)

        n += 1
        continue

    finally:
        all_list.append(user_num)


print(f'전체입력 list : {all_list}')
print(f'실수입력 list : {float_list}')
print(f'짝수입력 list : {even_list}')
print(f'홀수입력 list : {odd_list}')

3. Exception & riase

A. Exception

오류발생 원인 출력
except Exception as e:

print(e) #오류발생이유
float_nums = []
even_nums = []
odd_nums = []
data_list = []

n = 1
while n < 6 :

    try :
        user_num = input('input number please : ')
        input_data = float(user_num)

    except Exception as e :
        print('exception error raise\t',end='')
        print('not number !!')
        print(e)			#안녕 입력 시 : could not convert string to float: '안녕'
        continue

    else :
        if input_data - int(input_data) != 0 :
            float_nums.append(input_data)

        else :
            if input_data % 2 == 0 :
                even_nums.append(int(input_data))
            else :
                odd_nums.append(int(input_data))

        n += 1

    finally:
        data_list.append(user_num)

print(float_nums)
print(even_nums)
print(odd_nums)
print(data_list)

B. raise

반대로 예외를 발생시킴
raise Exception()
예외발생시 ()출력

def div_calculaotr (n1,n2) :

    if n2 != 0 :
        print(n1/n2)

    else :
        raise Exception('0으로 나눌 수 없습니다.')   #예외발생 raise Exception

n1 = int(input('input n1 : '))
n2 = int(input('input n2 : '))
print(div_calculaotr(n1,n2))


def sms (msg) :
    if len(msg) > 10 :
        raise Exception('길이초과 mms발생')
    else :
        print('sms 발송 완료')


try :
    msg = input('메세지를 입력하세요')

except Exception as e :
    print()

4. 사용자 예외클래스

내가 만드는 예외 클래스
Exception 클래스(예외클래스)를 상속하자

class not_use (Exception) :						#Exception class상속

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


def div_calculator(num1,num2) :

    if num2 == 0:
        raise not_use(num2)						#내가 만든 예외클래스 실행

    else :
        print(f'{num1} / {num2} = {num1/num2}')

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

#div_calculator(num1,num2)					#바로 사용할 경우 오류문구가 뜨므로 try에 묶을것

try :
    div_calculator(num1,num2)

except not_use as e :
    print(e)

💡Exception 클래스의 init 메소드

super().__init__(f'{n}은 사용할 수 없습니다.') 

super는 상위클래스를 상속하고 하위클래스에서 상위클래스를 실행할 때 다음과 같이사용한다.

super().__init__(self,매개변수)

❓ 하지만, 사용자함수에서 Exception클래스를 상속할 때 출력값을 적는데 이유가 무엇을까 ?
❗Exception 클래스는 init메소드에서 해단 익셉션 발생 시 어떤 메세지를 보여줄 지 입력받는다. 즉, 출력값이 아니라 Exception 객체를 초기화하기 위해 필요한 입력을 넣어준것.
단지 예외가 발생했을 때 해당 내용이 콘솔에 출력되게 하는 것이 Exception 클래스의 기능이기 때문에 출력을 써 준 것 처럼 보이는 것일 뿐.


제로베이스 데이터취업스쿨
Daily Study Note
profile
Study Log

0개의 댓글