파이썬에서 에러가 발생하면 기본적으로 코드가 중단되는데,
try except 문법을 활용하면 코드가 중단되지 않고 계속 진행할 수 있다.
try - except : 에러가 있어도 건너뛰게 할 수 있는 방법
예시1
- 정상 상황
people = [
{'name': 'carry', 'age': 38},
{'name': 'john', 'age': 7},
{'name': 'smith', 'age': 17},
{'name': 'ben', 'age': 27},
]
for person in people:
if person['age'] > 20:
print (person['name'])
# carry
# ben
- 데이터가 하나 잘못 입력된 상황
people = [
{'name': 'carry', 'age': 38},
{'name': 'john'},
{'name': 'smith', 'age': 17},
{'name': 'ben', 'age': 27},
]
for person in people:
if person['age'] > 20:
print (person['name'])
# KeyError: 'age' # 에러 발생함
# carry
- try except 사용하기
people = [
{'name': 'carry', 'age': 38},
{'name': 'john'},
{'name': 'smith', 'age': 17},
{'name': 'ben', 'age': 27},
]
for person in people:
try:
if person['age'] > 20:
print (person['name'])
except:
name = person['name']
print(f'{name} - 에러입니다')
# carry
# john - 에러입니다
# ben
이렇게 에러가 있어도 멈추지 말고 except 로 빼고 싶을 때 사용한다
예시2 에러 종류에 따라 다른 로직 처리
number = "num"
try: # try 구문 안에서 에러가 발생할 경우 except로 넘어감
number = int(number) # "num"을 숫자로 바꾸는 과정에서 에러 발생
except: # 에러가 발생했을 때 처리
print(f"{number}은(는) 숫자가 아닙니다.")
어떤에러가 발생했을 때 >>> 어떤 결과를 출력해라
라고 따로 명령할 수 있음.
number = input()
try:
# number = int(number)
int(number)
10 / number
except ValueError: # int로 변환하는 과정에서 에러가 발생했을 떄
print(f"{number}은(는) 숫자가 아닙니다")
except ZeroDivisionError: # 0으로 나누면서 에러가 발생했을 때
print("0으로는 나눌수 없습니다")
except Exception as e: # 위에서 정의하지 않은 에러가 발생했을 때(권장하지 않음)
print(f"예상하지 못한 에러가 발생했습니다 error : {e}")
# except 문법 또한 if / elif와 같이 연달아서 작성할 수 있음
여기서 마지막에 있는
except Exception as e
정의되지 않은 에러를 e 변수에 담아서 출력하려고 하는거다.
근데 남발하면 좋지 않음.
왜 에러가 발생했는지 알 수가 없기 때문이다.
이왕이면 위에서처럼
except ValueError:
except ZeroDivisionError:
이런식으로 구체적인 에러 발생 상황을 명시해서 빼주는 게 좋다.
에러명칭을 아는 방법은 그냥
내가 예외처리하고싶은 코드를 일부러 입력해보고,
출력된 에러 중에 앞부분을 따오면 된다.
예를 들어
10/0
# ZeroDivisionError: division by zero
int("number")
# ValueError: invalid literal for int() with base 10: 'number'
이렇게 하면 됨