파이썬/파이썬(python) 중급

[30-1 파이썬] 예외의 종류 FileNotFoundError, KeyError, IndexError, TypeError

Olivia-BlackCherry 2022. 9. 19. 17:05

에러의 종류에는 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)