haju__log
[python] 예외 처리 (try, except, exception, raise) 본문
반응형
✅ 예외 처리
- 문법
- 예외의 이름을 알고 있다면 예외를 잡을 수 있다.
try :
#에러가 발생할 가능성이 있는 코드
except Exception : #에러 종류
#에러가 발생했을 경우 처리할 코드
- 예제
text = '100%'
print(int(text))
text = '100%'
try:
print(int(text))
except ValueError:
print('{}는 숫자가 아니네요.'.format(text))
- 경우에 따라 예외 처리 대신 if-else문을 사용할 수 있다.
- 둘 다 가능할 경우, 보통 코드가 간결한 쪽을 선택하면 됨
- 예제
#예외가 발생하는지 미리 알아보기 위한 함수 만들기
#인덱스에 해당하는 값을 출력하고, 그 값을 리스트에서 지워주는 함수
def safe_pop_print(list,index):
try:
print(list.pop(index))
except IndexError:
print('{} index의 값을 가져올 수 없습니다.'.format(index))
safe_pop_print([1,2,3],5)
#위의 코드를 if-else문으로 바꿈
def safe_pop_print(list,index):
if len(list)>index:
print(list.pop(index))
else:
print('{} index의 값을 가져올 수 없습니다.'.format(index))
safe_pop_print([1,2,3],5)
- try~except가 아니면 해결하기 어려운 에러가 생기는 경우
- 예제
try :
import my_module
except ImportError:
print("모듈이 없습니다.")
✅ 예외(에러)의 이름을 모를 때
- 문법
try:
#에러가 발생할 가능성이 있는 코드
except Exception as ex: #에러 종류
print("에러가 발생했습니다.",ex) #ex는 발생한 에러의 이름을 받아오는 변수
- 예제1
try:
list=[]
print(list[0])
except Exception as ex:
print("에러가 발생했습니다.",ex)
- 예제2
try:
text='abc'
number=int(text)
except Exception as ex:
print("에러가 발생했습니다.",ex)
✅ raise : 예외 발생
- 사용자가 직접 에러를 발생시키는 기능
- raise Exception # 에러 종류
- 많이 사용하면 코드를 읽기 어려워진다.
def rsp(mine,yours): #가위바위보 승패를 판단하는 코드
allowed = ['가위','바위','보']
if mine not in allowed:
raise ValueError
if yours not in allowed:
raise ValueError
rsp('가위','바')
def rsp(mine,yours): #가위바위보 승패를 판단하는 코드
allowed = ['가위','바위','보']
if mine not in allowed:
raise ValueError
if yours not in allowed:
raise ValueError
try:
rsp('가위','바')
except ValueError:
print('잘못된 값을 넣은 것 같습니다.')
- 예제
- 조건문 : 1,2반이 있는 학교에서 190이 넘는 학생이 있으면 print문을 한 번만 출력하고 끝내고 싶음.
school = {'1반': [172,185,198,177,165,199],
'2반': [165,177,167,180,191]}
for class_number, students in school.items():
for student in students:
if student>190:
print(class_number,'반에 190을 넘는 학생이 있습니다.')
break
➡ 이렇게 코드를 짜면 print문이 2줄 실행되므로 조건에 맞지 않음.
(break문이 for student in students:에서만 작동하기 때문에)
school = {'1반': [172,185,198,177,165,199],
'2반': [165,177,167,180,191]}
for class_number, students in school.items():
for student in students:
if student>190:
print(class_number,'반에 190을 넘는 학생이 있습니다.')
raise StopIteration
➡ raise를 이용하면 1문장만 실행되고 에러를 발생시켜서 종료됨. 그러나 에러가 발생하지 않고 무사히 코드를 끝내야하므로, try~except 문을 이용해 다시 한번 코드를 수정해준다.
#최종 코드
school = {'1반': [172,185,198,177,165,199],
'2반': [165,177,167,180,191]}
try:
for class_number, students in school.items():
for student in students:
if student>190:
print(class_number,'반에 190을 넘는 학생이 있습니다.')
raise StopIteration
except StopIteration:
print('정상종료')
반응형
'코테관련 이론' 카테고리의 다른 글
[python] 리스트와 문자열 (split, join 이용) (0) | 2023.05.02 |
---|---|
[python] 리스트 메서드 정리 (List Method) (0) | 2023.05.01 |
[python] while문, break, continue (0) | 2023.04.30 |
[python] 튜플 packing, unpacking, 함수의 리턴값으로 튜플 이용 (0) | 2023.04.30 |
[python] 튜플 (tuple) (0) | 2023.04.30 |