에러의 종류에는 FileNotFoundError, KeyError, IndexError, TypeError가 있다.
1. FileNotFoundError
파일을 찾을 수 없음
: [Errno 2] No such file or directory: 'new_file.txt'
with open("new_file.txt") as file:
file.read()
V 해결방법
- 해당 파일경로에 파일이 존재하는지 체크
- 파일 이름 체크
V 예외처리
try:
file= open("new_file.txt")
except:
print("에러가 있습니다")
file = open("real_file.txt","w")
file.write("Success!")
else:
file.read()
finally:
file.close()
2. KeyError
딕셔너리에 해당 키가 없음
(a_dictionary 안에 non_existent_key가 없다.)
: 'non_existent_key'
a_dictionary = {"key": "value"}
value = a_dictionary["non_existent_key"]
V 해결방법
- 오타 확인
- 딕셔너리 안에 해당 키가 존재하는지 확인
V 예외처리
<기본>
try:
a_dictionary= {"key":"value"}
value = a_dictionary["non_existent_key"]
except:
print("키 에러가 있습니다")
value = a_dictionary["key"]
print(value)
else:
print("에러가 없습니다")
finally:
print("Good job!")
<except 구문에 에러제목 띄우기>
try:
a_dictionary= {"key":"value"}
value = a_dictionary["non_existent_key"]
except KeyError:
print("키 에러가 있습니다")
value = a_dictionary["key"]
print(value)
except FileNotFoundError:
print("해당 경로에 파일이 없습니다")
else:
print("에러가 없습니다")
finally:
print("Good job!")
<except 에러제목에 이름붙이기>
try:
a_dictionary= {"key":"value"}
value = a_dictionary["non_existent_key"]
except KeyError as error_message:
print(f"{error_message} 에러가 있습니다")
value = a_dictionary["key"]
print(value)
except FileNotFoundError:
print("해당 경로에 파일이 없습니다")
else:
print("에러가 없습니다")
finally:
print("Good job!")
3. IndexError
허용하는 인덱스 범위를 초과함
(school list의 인덱스가 0, 1, 2까지 있다. 인덱스4는 없다)
list index out of range
school =["student", "teacher", "book"]
school = school[4]
V 해결방법
- 해당 리스트, 튜플, 문자열 등 시퀀스가 있는 데이터에서
인덱스의 범위가 최대 어디까지인지 확인
- 0부터 시작되는 것을 기억하기
V 예외처리
try:
school = ["student", "teacher", "book"]
school = school[4]
except IndexError:
school= school[1]
print(school)
else:
print("에러가 없습니다")
finally:
print("Good job")
4. TypeError
데이터 타입이 맞지가 않음
"1234"는 str타입인데, 4는 int타입이다. 서로 다른 데이터타입에서는 연산이 되지 않는다.
can only concatenate str(not "int") to str
text = "1234"
print(text+4)
V 해결방법
- 데이터 유형을 맞춰주기
- str(), int(), float() 함수를 이용하여 데이터 형을 통일
V 예외처리
try:
text = "1234"
print(text + 4)
except TypeError as typeError:
print(f"{typeError}")
text = 1234
print(text + 4)
else:
print(text + 4)
finally:
print("Good job")
유의할 점
try 구문에서 첫 번째로 나타난 에러만 except 처리함
try구문에서 가장 먼저 잡은 에러를 except로 해결하고 나면,
try 구문에서 다른 에러가 남아 있더라도
처리하지 않고 구문을 빠져나간다.
try:
text = "1234"
print(text + 4)
file = open("new_file.txt")
except TypeError as typeError:
print(f"{typeError}")
text = 1234
print(text + 4)
except FileNotFoundError as error:
print(f"에러: {error}")
else:
file.read()
finally:
print("Good job")
>>
can only concatenate str (not "int") to str
1238
Good job
try:
file = open("new_file.txt")
text = "1234"
print(text + 4)
except TypeError as typeError:
print(f"{typeError}")
text = 1234
print(text + 4)
except FileNotFoundError as error:
print(f"에러: {error}")
else:
file.read()
finally:
print("Good job")
>>
에러: [Errno 2] No such file or directory: 'new_file.txt'
Good job
에러가 발생하는 부분만 예외처리를 해주면 코드가 깔끔함
fruits = ["Peach", "Pear", "Orange"]
def make_juice(index):
fruit = fruits[index]
print(fruit + " juice")
make_juice(4)
위 코드는 index 에러가 발생한다.
1) 에러가 나는 코드 전체 -> 예외처리
try:
fruits = ["Peach", "Pear", "Orange"]
def make_juice(index):
fruit = fruits[index]
print(fruit + " juice")
make_juice(4)
except IndexError as e:
print(f"에러 이유는 {e}입니다")
else:
print("에러가 없습니다")
finally:
print("Good job!")
2) 에러 발생하는 지점만 -> 예외처리
fruits = ["Peach", "Pear", "Orange"]
def make_juice(index):
try:
fruit = fruits[index]
print(fruit + " juice")
except:
print("fruit juice")
else:
print(fruit + " juice")
make_juice(4)
except 구문 처리하는 방법
1) 새로운 코드 작성하기
instagram_posts = [
{'Likes': 2, 'Comments': 9},
{'Likes': 3, 'Comments': 1, 'Shares': 35},
{'Likes': 42, 'Comments': 2, 'Shares': 6},
{'Comments': 4, 'Shares': 2},
{'Comments': 1, 'Shares': 3},
{'Likes': 76, 'Comments': 3}
]
total_likes = 0
for post in instagram_posts:
try:
total_likes = total_likes + post['Likes']
except KeyError:
post['Likes'] = 0
total_likes=total_likes + post['Likes']
print(total_likes)
instagram_posts = [
{'Likes': 2, 'Comments': 9},
{'Likes': 3, 'Comments': 1, 'Shares': 35},
{'Likes': 42, 'Comments': 2, 'Shares': 6},
{'Comments': 4, 'Shares': 2},
{'Comments': 1, 'Shares': 3},
{'Likes': 76, 'Comments': 3}
]
total_likes = 0
for post in instagram_posts:
try:
total_likes+= 0
except KeyError:
post['Likes'] = 0
total_likes=total_likes + post['Likes']
print(total_likes)
2) pass
instagram_posts = [
{'Likes': 2, 'Comments': 9},
{'Likes': 3, 'Comments': 1, 'Shares': 35},
{'Likes': 42, 'Comments': 2, 'Shares': 6},
{'Comments': 4, 'Shares': 2},
{'Comments': 1, 'Shares': 3},
{'Likes': 76, 'Comments': 3}
]
total_likes = 0
for post in instagram_posts:
try:
total_likes = total_likes + post['Likes']
except KeyError:
pass
print(total_likes)
'파이썬 > 파이썬(python) 중급' 카테고리의 다른 글
[30-3 파이썬] 예외처리 raise 키워드 (1) | 2022.09.19 |
---|---|
[30-2 파이썬] 예외처리, try, except, else, finally (1) | 2022.09.19 |
[29-2 파이썬] tkinter 패스워드 매니저 만들기 (0) | 2022.09.18 |
[29-1 파이썬] tkinter grid 격자 관련 팁, columnspan, rowspan (0) | 2022.09.17 |
[28-6 파이썬] tkinter 타이머 만들기, after_cancel() (최종) (0) | 2022.09.17 |