예외처리란?
-파이썬에서의 예외처리는 프로그램 실행 중에 발생할 수 있는 오류(예외)를 관리하여 프로그램이 비정상적으로 종료되지 않도록 하는데 사용
-예외처리를 통해 오류가 발생하더라도 프로그램이 정상적으로 실행을 계속하거나 사용자에게 적절한 메시지를 제공하도록 함.
에러(Error):
구문(Syntax) 오류: 문법에 맞지 않거나 오타가 났을 경우 발생하는 오류
-> IDE에서 실행 전에 알 수 있다.
예외(Exception):
실행(Runtime) 오류: 문법적인 오류는 없지만 실행(run)될 때 에러가 발생하는 경우
e.g. 불러오려는 파일이 없는 경우, 리스트 요소를 읽으려는데 요소가 없는 경우 등
=>에러가 발생되면 프로그램이 동작 중지 또는 종료된다.
즉, 예외처리란 에러가 발생할만한 부분을 예측하여, 미리 예외 상황에 대한 처리를 하는 것이다. (except 블록에서는 첫번째로 일치하는 예외를 선택 후 처리!)
=> Try 블록에서 발생한 예외를 except 블록에서 처리한다.
try:
-예외가 발생할 가능성이 있는 코드를 포함
-예외가 발생하면 해당 블록의 나머지 코드는 실행되지 않고 except 블록으로 이동
except:
-특정 예외를 처리하는 블록
-발생한 예외의 종류에 따라 맞는 except 블록이 실행됨
->예외를 지정하지 않는 경우 모든 예외를 처리할 수 있다.
else:
-try 블록에서 예외가 발생하지 않은 경우 실행
->예외가 발생하면 실행되지 않음
finally:
-예외 발생 여부와 상관 없이 항상 실행되는 곳
-파일 닫기, 리소스 해제 등 반드시 실행되어야 하는 코드를 여기에 작성
IndexError: 리스트 인덱스 에러
ValueError: 부적절한 값을 가진 인자를 받았을 때 발생하는 에러
ZeroDivisionError: 0으로 나눌 때 발생하는 오류
NameError: 존재하지 않는 변수를 호출할 때
FileNotFoundError: 존재하지 않는 파일을 호출할 때
<예외 처리 예시 코드1>
try:
#예외가 발생할 가능성이 있는 코드
x = int(input("숫자를 입력하세요: "))
result = 10 / x
except ZeroDivisionError: #특정 예외 처리
print("0으로 나눌 수 없습니다.")
except ValueError: # 또 다른 특정 예외 처리
print("유효한 숫자가 아닙니다.")
else: #예외가 발생하지 않았을 때 실행
print("결과: ", result)
finally: #예외 발생 여부와 상관 없이 항상 실행
print("프로그램이 종료됩니다.")
+) try는 꼭 있어야 하고, except도 하나 이상 있어야 하지만, finally는 없어도 된다.
<예외 처리 예시 코드2-세부 확인>
try:
x = int("abc")
except ValueError as e:
print("예외 메시지: ", e)
#예외 메시지: invalid literal for int() with base 10: 'abc'
<예외 처리 예시 코드3-여러 예외 동시에 처리>
try:
#예외가 발생할 가능성이 있는 코드
x = int(input("숫자를 입력하세요: "))
result = 10 / x
except (ValueError, ZeroDivisionError) as e:
print("예외 발생: ", e)
명시적으로 예외를 발생시킬 때 사용
e.g. raise Exception("예외 메시지")
<예외 처리 예시 코드4-raise의 활용>
def divide(a,b):
if b == 0:
#ZeroDivisionError 발생
raise ZeroDivisionError("0으로 나눌 수 없습니다.")
return a / b
try:
result = divide(10, 0)
except ZeroDivisionError as e:
print("예외 발생: ", e)
종종 코딩을 하다보면 자주 마주하게 되는 에러들을 미리 처리하는 방식을 알게 되어 흥미로웠다. 하지만 미리 어떤 에러가 발생할지 예측하는 것이 아직은 어렵게만 느껴진다. 좀 더 경험이 쌓인다면 자유자재로 예외 처리를 활용할 수 있지 않을까.