Yeonnnnny

[python] 예외 처리 본문

Python

[python] 예외 처리

yeonny_do 2023. 10. 26. 00:06

■ 예외(Exception)란 ?  

 

  - 프로그램의 실행 도중에 만날 수 있는 오류들을 Exception이라고 함

  - 파이썬에서는 안정적인 프로그래밍 작성을 위해 try, except를 이용해서 오류처리를 할 수 있음

 

# 방법 1
try : 
	오류발생 코드
except:
	오류처리 코드
    
    
# 방법 2
try : 
	오류발생 코드
except 발생 오류:
	오류처리 코드
    
    
# 방법 3 **
try : 
	오류발생 코드
except 발생 오류 as 오류 메세지 변수:
	오류처리 코드
    
    
# 방법 4
try : 
	오류발생 코드
except 발생오류 as 오류 메시지 변수:
	오류처리 코드
else : 
	오류가 발생하지 않았을 때 코드
  
  
# 방법 5 **
try : 
	오류발생 코드
except 발생 오류 as 오류 메시지 변수:
	오류처리 코드    
finally : 
	반드시 처리해야 하는 코드

   * 방법 5의 finally에는 예외 발생 시 메모리 과다를 막기 위해 할당된 메모리를 해제하는 코드가 작성됨 

 

 

■ if-else와 예외처리의 차이

 

1) if-else는 프로그램의 흐름을 제어하는 반면, 예외처리 try-except는 에러를 처리하기 위함이기 때문에 목적 자체가 다름

 

2) 예외를 처리하는 곳이 다름. if-else로 예외를 다룬다면 예외가 발생되는 곳에서 수행되는 것이기 때문에 그냥 논리적인 흐름을 제어하는 것 뿐임. 그래서 UI(User Interface)에서는 예외 처리 여부, 방법을 알 수 없음.

 

  => 보통 프로그램을 개발할 때, MVC(Model, View, Control)방식으로 개발을 하는데, 이 방식은 기능하는 역할 별로 분리해서 각각의 프로세스를 만드는 것임. 이렇게 코드가 분리된 경우에 예외 처리 방식(try-except)을 이용함. 

 

def inputNum():
	num = int(input('양수 입력 : '))
	if num<0:
		print('양의 정수만 입력')
	else:
		return num
        
num=inputNum()
print(num)


#양수 입력 :  -1  #음의 정수 입력했을 때 예외 발생
#양의 정수만 입력
#None    #None이 반환됨

  → 함수의 주목적은 return 처리임. 그런데 예외 발생 시 함수 내부에서 if-else로 예외를 처리하게 되면 none값이 반환되는 등 함수의 주목적을 해치게 됨. 즉, 매커니즘에 있어서 다름. 그래서 예외 발생 시에 예외 처리 방법을 지향해야 함 

 

def inputNum():
    num=int(input('양수 입력: '))
    	if num<0:
    		raise ValueError('양의 정수만 입력하세요')
    return num
   
   
try:
    num=inputNum()
    print(num)
except ValueError as e:
	print(e)
    
#양수 입력 :  -10
#양의 정수만 입력하세요

  → if-else로 처리하는 것과 달리, 예외 발생시 예외 문자를 출력하고 함수의 반환값이 전달되지 않음.

 

 

■ 대표적인 예외의 종류

 

NameError 초기화하지 않은 변수를 사용할 때 발생
ValueError 타입은 맞지만 값의 형식이 잘못되었을 경우 발생
ZeroDivisionError 0으로 나누었을 때 발생
IndexError 첨자가 범위를 벗어났을 때 발생
TypeError 타입이 맞지 않은 경우 발생

 

# 예외 발생 상황

a = [1,2,3,4,5]
print(a[5])  #IndexError

b = '1234a'
c=int(b)     #ValueError

f=open('notexists.txxt','r')  #FileNotFoundError

data=10/0     #ZeroDivisionError

mydic={}
print(mydic['key']) #KeyError

 

■ 예외 강제 발생

 

  - 특정 조건에 맞지 않은 상황을 예외로 처리할 수 있음

  - 이런 경우 raise 명령어를 사용하여 예외를 인위적으로 발생시킬 수 있음

num=int(input('숫자 입력 : '))
if num<0:
	raise ValueError('양수만 입력하세요')
else : 
	print('num = ',num)

 

 

■ 예외 처리 예시

 

try:
	f=open('dontexist.txt','r') #FileNotFoundError:파일이 없으면 오류발생
except FileNotFoundError as e:
	print(e)
else:
	data = f.read()
    print(data)
    f.close()

 

try:
	data = 10/0  # ZeroDivisionError
except ZeroDivisionError as e:
	print(e)

 

try:
	f=open('dontexist.txt','w')
    	f.write('안녕하세요??')
finally:  # 반드시 처리해야 하는 블록으로 cleanup하는 코드가 사용
	f.close()

 

try:
    a=[1,2,3]
    print(a[3])
    print(10/0)
except ZeroDivisionError:
	print('0으로 나눌 수 없습니다.')
except IndexError:
	print('리스트의 범위를 벗어났습니다.')

print('End')

#리스트의 범위를 벗어났습니다.
#End

 

try:
    a=[1,2,3]
    print(a[3])
excpet IndexError:
	print('리스트의 범위를 벗어났습니다')
finally:
	print('항상 실행되는 코드')

print('end')

#리스트의 범위를 벗어났습니다
#항상 실행되는 코드
#end

 

try:
    a=[1,2,3]
    print(a[2])
excpet IndexError:
	print('리스트의 범위를 벗어났습니다')
finally:
	print('항상 실행되는 코드')

print('end')

#항상 실행되는 코드
#end

    * 리턴문을 만나도 finally는 무조건 실행됨 ↓

def re():
	return
    
try :
	re()
except IndexError:
	print('리스트의 범위를 벗어났습니다.')
finally: #return 구문을 만나도 실행됨
	print('항상 실행되는 코드')
    
print('end')

#항상 실행되는 코드
#end

'Python' 카테고리의 다른 글

[python] File과 Directory  (2) 2023.10.29
[python] 입출력 (I/O)  (1) 2023.10.29
[python] 표준 모듈  (1) 2023.10.25
[python] docstring  (0) 2023.10.25
[python] 값으로서의 함수  (0) 2023.10.25