예외 처리

예외처리란?
-파이썬에서의 예외처리는 프로그램 실행 중에 발생할 수 있는 오류(예외)를 관리하여 프로그램이 비정상적으로 종료되지 않도록 하는데 사용
-예외처리를 통해 오류가 발생하더라도 프로그램이 정상적으로 실행을 계속하거나 사용자에게 적절한 메시지를 제공하도록 함.

에러와 예외

에러(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)

raise

명시적으로 예외를 발생시킬 때 사용
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)

종종 코딩을 하다보면 자주 마주하게 되는 에러들을 미리 처리하는 방식을 알게 되어 흥미로웠다. 하지만 미리 어떤 에러가 발생할지 예측하는 것이 아직은 어렵게만 느껴진다. 좀 더 경험이 쌓인다면 자유자재로 예외 처리를 활용할 수 있지 않을까.

0개의 댓글