일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- PostgreSQL
- 파이썬 #python #함수 #function
- 파이썬 #python #가변매개변수 #키워드가변매개변수 #args #kwargs
- 파이썬 #python #os #os.path #glob
- docker
- 연산자메서드
- 파이썬 #python #전역변수 #지역변수 #eval
- 파이썬 #python #예외처리 #exception
- aws
- redis
- 프로그래머스
- aw3
- 약수 수하기
- 파이썬 #python #enumerate
- 파이썬 #python #filter #map #reduce
- Git
- jsonb
- 파이썬 #python #docstring
- 파이썬 #python #class #클래스 #상속
- 파이썬 #python #file #i/o #input #output
- EC2
- 민감 정보 관리
- 파이썬 #python #지역함수
- 사용자정의예외
- 파이썬기본문법 #파이썬 #python
- 배포
- 파이썬 #python #모듈 #module #import #random #time #calendar #sys
- 파이썬 #python #lambda #람다
- 파이썬 #python #Comprehension
- spring boot
- Today
- Total
Yeonnnnny
[python] 예외 처리 본문
■ 예외(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 |