새소식

데이터분석/둘째주

파이썬 Python : 예외

  • -
728x90

예외

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

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

예시)

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)
-- 출력 --
first number: 10
second number: 20
30
-10
200
0.5

0으로 나눌수 없어서 division error 발생

-- 출력 --
first number: 10
second number: 0
10
10
0
ZeroDivisionError: division by zero

 

 

예외 종류

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

    Exception    
     
AirthmeticError   Environment Error   LookupError   SyntaxError
     
ZeroDivisionError   IOError   IndexError   IndentationError

 

 

 

728x90

예외 처리

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

프로그램 실행1  
 
프로그램 실행2  
 
프로그램 실행3 ─▶예외발생! 발생한 예외에 대해서 별도 처리함.
 
프로그램 실행4  

 

 try ~ except     

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

 

n1 = 10; n2 = 0
print(n1/n2)
print(n1*n2)
print(n1-n2)
print(n1+n2)
-- 출력 --
Traceback(most recent call last):
        File="~ ....py", line 3, in <module>
                print(n1/n2)
ZeroDivisionError: division by zero

 

n1 = 10; n2 = 0

try:	#예외발생이 예상되는 구문
	print(n1/n2)
except:	#문제가 발생시 실행할 부분
	print("예상치 못한 예외가 발생했습니다.")
	print("다른 프로그램 실행에는 문제가 없습니다.")

print(n1*n2)
print(n1-n2)
print(n1+n2)
-- 출력 --
예상치 못한 예외가 발생했습니다.
다른 프로그램 실행에는 문제가 없습니다.
0
10
10

 

 

[실습]

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

nums = []

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

print(f'nums: {nums}')

 

 

반응형

 try ~ except ~ else    

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

else 뒤에  예외가 발생하지 않는 경우 실행할 구문을 쓴다.

 

nums = []

n=1
while n < 6:
	try:
    	num = int(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("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(num)
					
	n += 1

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

 

 

 try ~ except ~ else ~ finally   

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

else 뒤에  예외가 발생하지 않는 경우 실행할 구문을 쓴다.

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

네트워크에 연결해서 외부 자원을 가지고 사용을 할때, 예외발생 여부와 상관없이 마지막에 자원 해제를 할때 주로 사용한다.

 

try:
	inputData = 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}')

 

 

[실습]

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

 

 

 

 Exception   

예외 담당 클래스

except 구문과 함께 사용:  【  except Exception as 별칭:  】

raise 구문과 함께 사용:   【  raise Exception("메세지")  】 

                                          or  【  raise Exception("메세지", 데이터)  】

Exception() 메서드의 인수값 호출:  【  Exception.args[인덱스 숫자]  】  or  【  별칭.args[인덱스 숫자]  】

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

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}')
-- 출력 --
input number1: 10
input number2: 0
0으로 나눌 수 없습니다.
num1 * num2 = 0
num1 + num2 = 10
num1 - num2 = 10

 

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

try:
	print(f'num1 / num2 = {num1 / num2}')
except Exception as e:	#Exception 이라는 클래스를 사용하여 에러내용을 출력할 수 있다.
	print(f'exception: {e}')

print(f'num1 / num2 = {num1 * num2}')
print(f'num1 / num2 = {num1 + num2}')
print(f'num1 / num2 = {num1 - num2}')
-- 출력 --
input number1: 10
input number2: 0
exception: division by zero
num1 * num2 = 0
num1 + num2 = 10
num1 - num2 = 10

 

 

 

 

 raise   

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

raise 단일 사용:   【  raise  】   

예외처리 이름과 함께 사용:   【  raise 에러명  】  raise ValueError

메세지와 함께 사용:   【  raise Exception("메세지")  】   or   【  raise Exception("메세지", 데이터)  】

try ~ except 구문과 함께 사용:   【  try:                                                           

                                                                 예외 발생이 예상되는 실행 구문       】

                                                                 if 조건:                                              】

                                                                          raise                                        】

                                                         【  except:                                                   】

                                                         【         예외발생시 실행되는 구문               】

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

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

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

 

 

[실습]

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

def sendSMS(msg):
	if len(msg) > 10:	#10글자보다 크면 예외발생시킴
		raise Exception('길이 초과! MMS 전환 후 발송', 1)

	else:
		print('SMS 발송!')

def sendMMS(msg):
	if len(msg) <= 10:	#10글자 이하이면 예외발생시킴
		raise Exception('길이 미달! SMS 전환 후 발송', 2)
	else:
		print('MMS 발송!')

msg = input('input message: ')

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(mag)

 

 

반응형
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.