예외 처리(Exception Handling)란?
에러는 코딩에 있어서 마치 친구와 같은 존재입니다. 현재도 에러가 없고, 앞으로도 100% 에러가 없을 것이라고 보장하는 프로그램은 어디에도 없습니다.
에러가 발생할 때마다 프로그램의 실행이 중단되면 유저나 서비스를 관리하는 입장에서 난처한 상황이 발생합니다. 따라서 에러가 발생할 가능성이 높은 구간에 에러가 발생하더라도 프로그램 실행을 멈추지 말고 계속 유지하도록 명령해 주는 작업이 필요한데요. 이런 작업을 예외 처리라고 합니다.
예외 처리(Exception Handling) 또는 오류 처리(Trouble Shooting)는 실행 흐름상 오류가 발생했을 때 오류를 그대로 실행시키지 않고 오류에 대응하는 방법을 제시하는 개념을 의미합니다. - 나무위키
예외 처리 전략에는 크게 두 가지가 있습니다.
첫 번째는 EAFP(It's Easier to Ask Forgiveness than Permission) 전략입니다. 일단 시도하고 나중에 용서를 구한다는 의미를 지니고 있는데요. 먼저 코드를 실행하고 에러가 발생하면 예외 처리를 하는 전략입니다.
두 번째는 LBYL(Look Before You Leap) 전략입니다. 눕기 전에 살펴보라는 의미인데요. 발생할 수 있는 모든 에러의 경우의 수를 검토하여 미리 조치를 취하는 전략입니다.
파이썬에서 많이 활용되는 예외 처리 전략은 EAFP 전략입니다. try와 except 구문을 활용하여 이 전략을 구현할 수 있습니다. try & except 구문의 실행 원리를 한 문장으로 정의하면 아래와 같습니다.
"에러가 발생할 가능성이 있지만, 일단 한번 코드를 실행해 봐! 에러가 발생한다면? Plan B 코드를 실행하도록 해!"
기초적인 문법을 살펴볼까요. 에러가 발생할 가능성이 있지만, 일단 한번 코드를 실행해 보도록 하는 명령어가 try입니다. 그리고 에러가 발생할 경우, Plan B 코드를 실행하도록 유도하는 명령어가 except입니다.
# 예외 처리 문법
try:
실행할 코드
except:
예외 발생 시 실행하는 코드
예외 처리 실습
예외 처리에 가장 많이 활용되는 예시는 나눗셈입니다. 0으로 나누면 아래처럼 'ZeroDivisionError'가 발생합니다. 에러가 발생하면 밑의 코드는 실행이 되지 않습니다.
10 / 0
print("이 코드는 실행이 될까요?")
# 에러 메세지
---------------------------------------------------------------------------
ZeroDivisionError Traceback (most recent call last)
<ipython-input-48-ed0809b8fa92> in <module>
----> 1 10 / 0
2 print("이 코드는 실행이 될까요?")
ZeroDivisionError: division by zero
에러가 발생하더라도, 밑의 print문을 실행할 수 있도록 코드를 수정해 보겠습니다. try와 except 구문을 활용하면 에러가 발생하더라도 아래처럼 프로그램을 끝까지 실행할 수 있습니다.
try:
10 / 0
except:
print("이 코드는 실행이 될까요?")
# 이 코드의 실행 결과
이 코드는 실행이 될까요?
특정 예외만 처리하고 싶다면 except 에러명!
모든 에러가 아니라, 특정 에러만 처리하고 싶다면 except 뒤에 에러명을 적어주시면 됩니다. 아래 코드는 variable이라는 변수가 미리 정의되어 있지 않기 때문에 NameError가 발생했는데요.
except 구문 뒤에 'ZeroDivisonError'라는 에러 이름을 지정해 두었기 때문에 예외처리가 안된 경우입니다. ZeroDivisionError는 0으로 나누는 경우에만 발생하니까요.
try:
variable
except ZeroDivisionError:
print("이 코드가 실행될까요?")
# 위 코드의 실행 결과
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
<ipython-input-63-224fbe7b6c39> in <module>
1 try:
----> 2 variable
3 except ZeroDivisionError:
4 print("이 코드가 실행될까요?")
NameError: name 'variable' is not defined
여러 개의 에러를 처리하고 싶다면?
여러 개의 에러를 처리하고 싶다면 except 구문을 여러 번 선언해 주면 됩니다. ZeroDivision 에러가 가장 발생할 경우가 높고, 그 외 다른 에러가 발생할 수도 있다고 가정하겠습니다. 보통 가장 많이 발생할 수 있는 메인 에러를 처리하는 구문을 먼저 선언하고요. 그다음에 기타 에러를 처리하는 구문을 넣기도 합니다.
try:
variable
except ZeroDivisionError:
print("0으로 나눌 수 없습니다.")
except:
print("ZeroDivisionError 외 다른 에러가 발생했습니다.")
# 위 코드의 결과값
ZeroDivisionError 외 다른 에러가 발생했습니다.
에러 메시지의 종류: 파이썬에는 어떤 에러들이 있을까?
예외 처리에 대해 배워봤는데요. 그렇다면 과연 파이썬에는 다양한 에러 메시지가 있을까요? 대표적인 오류 메시지는 아래와 같습니다. 공부에 도움이 되셨으면 좋겠습니다.
1. SyntaxError: 문법 오류를 의미합니다. 약속되지 않은 문법을 사용할 경우 발생합니다. (띄어쓰기를 잘못하는 등)
2. ZeroDivisionError: 0으로 나눌 경우에 발생하는 오류입니다.
3. NameError: 변수가 정의, 선언되기 이전에 변수를 사용하여 에러가 나오는 경우입니다.
4. TypeError: 연산이 되는 대상의 자료 유형이 일치하지 않는 경우 발생합니다.
5.. ValueError: 참조할 수 있는 값이 없을 때 발생합니다.
6. IndexError: 참조할 수 있는 인덱스가 없을 때 발생합니다. 주로 배열에서 인덱싱을 잘못하는 경우에 발생합니다.
7. AttributeError: 모듈이나 클래스의 속성을 잘못 사용할 경우에 발생합니다.
'Python > 기초' 카테고리의 다른 글
정규 표현식이란? 개념과 공부 방법에 대해 알려 드립니다. (0) | 2023.07.14 |
---|---|
[파이썬/Python] 함수 심화: 인자 전달 방법과 default 값 (0) | 2023.07.13 |
[파이썬/Python] Class에 특별한 메서드 (0) | 2023.07.12 |
[파이썬/Python] 정적 메서드, 클래스 메서드, 인스턴스 메서드 (0) | 2023.07.12 |
[파이썬/Python] 이해하기 쉬운 데코레이터 원리 (0) | 2023.07.11 |
댓글