예외처리
에러는 프로그램을 중지시키므로 치명적이며 예상한 부분과 그렇지 못한 부분에서 발생한다.
예상한 부분에서의 예외처리는 조건문을 이용해 처리할 수 있다.
하지만 권장하는 방법은 try - exception
을 이용하는 것이다.
# 0으로 나누면 ZeroDivisionError가 발생한다.
# 에러가 날 것으로 예상되는 코드를 try 이하에 작성한다.
# 이 부분에서 에러가 발생하면 except 이하의 코드가 실행된다.
# 또한 발생한 에러가 첫번째 예외상황(ZeroDivisionError)에 해당되지 않는다면 다음 예외상황(ValueError)으로 넘어간다.
# 만약 해당되지 않는다면 에러를 발생하며 프로그램이 종료된다.
a = 10
b = 0
try:
print(f"a / b: {a / b}")
except ZeroDivisionError:
print("0으로 나누면 안됩니다!")
except ValueError:
print("Value Error!")
# except에 에러를 적지 않으면 모든 예외 상황을 처리한다.
# 하지만 이 방법은 권장하지 않는다.
# 어떤 에러가 발생하는지 모르기 때문에 문제를 해결할 수 없으므로 위와 같이 에러 상황을 나열하여 처리하는게 좋다.
try:
print(f"a / b: {a / b}")
except:
print("0으로 나누면 안됩니다!")
# 이렇게 조건문으로 예외를 처리할 수 있지만 권장하지 않는다.
if b != 0:
print(f"a / b: {a / b}")
else:
print("0으로 나누면 안됩니다!")
# finally는 try 이하 코드가 에러 발생유무에 상관없이 실행된다.
try:
print(f"a / b: {a / b}")
except:
print("0으로 나누면 안됩니다!")
finally:
print("에러가 발생하던 안하던 상관없이 이 영역은 동작한다.")
print("=======================================")
print("예외가 발생하면 이 부분은 출력이 안됩니다.")
print("=======================================")
또한, 필요에 따라 에러를 일부로 발생시킬 수 있다.
여기 2가지 방법이 있다.
# raise 라는 예약어(reserved word)를 이용하여 에러를 발생시킬 수 있다.
a = 3
if a % 2 == 1:
raise ValueError("a가 홀수입니다.")
# assert 라는 예약어(reserved word)를 이용하여 해당 조건(n < 10)이 거짓이면 assertError를 발생시킨다.
def print_hello(n):
assert n < 10
for i in range(n):
print("hello")