Language/Python
[Python] 예외
Sh-YE
2024. 6. 4. 14:37
예외란?
문법적인 문제는 없으나 실행 중 발생하는 예상하지 못한 문제이다.
(문법적인 문제가 있으면 에러)
ex) 10 / 0 -> ZeroDivisionError
def add(n1,n2):
print(n1+n2)
def div(n1,n2):
print(n1/n2)
fn = int(input('input firstNum : '))
sn = int(input('input secondNum : '))
add(fn,sn)
div(fn,sn)
>>>
10
ZeroDivisionError: division by zero
예외관련 클래스는 Exception 클래스를 상속한다.
예외처리
예상하지못한 예외가 프로그램 전체 실행에 영향이 없도록 처리.
1) try ~ except
예외 발생 예상 구분을 try ~ except로 감싼다.
def add(n1,n2):
print(n1+n2)
def div(n1,n2):
try:
print(n1/n2)
except:
print('예상치 못한 문제가 발생했습니다.')
fn = int(input('input firstNum : '))
sn = int(input('input secondNum : '))
add(fn,sn)
div(fn,sn)
>>>
input firstNum : 10
input secondNum : 0
10
예상치 못한 문제가 발생했습니다.
1-1) try ~ except ~ else
예외 발생 예상 구분을 try ~ except로 감싼다.
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('홀수입니다. 다시 입력하세요')
print(nums)
1-2) finally
예외발생과 상관없이 항상 실행.
evenList = []; oddList = []; floatList = []; dataList = []
n = 1
while n < 6:
try:
data = input('숫자 입력 : ')
floatnum = float(data)
except:
print('예외발생!')
continue
else:
if floatnum - int(floatnum) != 0:
print('float number')
floatList.append(floatnum)
else:
if floatnum % 2 == 0:
print('even number!')
evenList.append(int(floatnum))
else:
print('odd number')
oddList.append(int(floatnum))
n += 1
finally:
dataList.append(data)
print(f'evenList: {evenList}')
print(f'oddList:{oddList}')
print(f'floatList:{floatList}')
print(f'dataList:{dataList}')
2) 예외담당 클래스 Exception
def add(n1,n2):
print(n1+n2)
def div(n1,n2):
try:
print(n1/n2)
except Exception as e:
print(f'exception: {e}')
fn = int(input('input firstNum : '))
sn = int(input('input secondNum : '))
add(fn,sn)
div(fn,sn)
>>>
input firstNum : 10
input secondNum : 0
10
exception: division by zero
3) raise
raise 키워드를 이용하면, 예외를 발생시킬 수 있다.
def div(n1,n2):
if n2 != 0:
print(n1/n2)
else:
# n2가 0이 아닐경우, 강제로 예외발생시킴
raise Exception('0으로 나눌 수 없습니다.')
fn = int(input('input firstNum : '))
sn = int(input('input secondNum : '))
try:
div(fn,sn)
except Exception as e:
print(f'exception: {e}')
>>>
input firstNum : 10
input secondNum : 0
exception: 0으로 나눌 수 없습니다.
4) 사용자 예외 클래스
class NotUseZeroExcepton(Exception):
def __init__(self,n):
super().__init__(f'{n}은 사용할 수 없습니다.')
def divCalculator(num1,num2):
if num2 == 0:
raise NotUseZeroExcepton(num2)
else:
print(f'{num1} / {num2} = {num1 /num2 }')
num1 = int(input('input number1 : '))
num2 = int(input('input number2 : '))
try:
divCalculator(num1,num2)
except NotUseZeroExcepton as e:
print(e)
>>>
input number1 : 10
input number2 : 0
0은 사용할 수 없습니다.