파이썬 try, except, finally raise, 예외처리
1. 예외 처리
※ 자주 발생하는 오류
- 없는 파일을 열려고 시도할 경우 : FileNotFoundError
- 0으로 다른 숫자를 나누는 경우 : ZeroDivisionError
- 리스트에서 얻을 수 없는 값을 호출할 경우 : IndexError
- 꼭 작성해야 하는 부분이 구현되지 않았을 경우 : NotImplementError
※ 구문별 비교
- try : 오류가 발생할 수 있는 구문
- except Exception as e : 오류 발생
- else : 오류 발생하지 않음
- finally : 무조건 마지막에 실행
(1) try, except문
- try문 수행 도중 오류가 발생하면 except 문이 수행
try:
...
except [발생오류[as오류 메시지 변수]]: ##대괄호[] 안은 생략 가능
...
- 예시 1
try:
4 / 0
except ZeroDivisionError as e:
print(e)
>>> division by zero
- 예시 2
people = [
{'name': 'bob', 'age' : 20}
...
...
]
for person in people:
try:
if person['age'] >20:
print(person['name']
except:
print(person['name'], '에러입니다')
>>> carry
>>> ben
>>> bobby 에러입니다
>>> red
>>> queen
- 여러개의 오류 처리
try:
...
except 발생오류 1:
...
except 발생오류 2:
...
- 여러개의 오류처리의 경우 try문을 수행하다 먼저 발생한 오류만 출력하고 문을 빠져나온다.
그러므로 아래 예시와 같이 인덱싱 오류만 출력한다.
try:
a = [1, 2]
print(a[3]) ## 인덱싱 오류가 먼저 발생
3/0
except ZeroDivisionError:
print("0으로 나눌 수 없습니다.")
except IndexError:
print("인덱싱 할 수 없습니다.")
>>>"인덱싱 할 수 없습니다."
- 오류 메시지를 아래와 같이 가져올 수도 있다.
try:
a = [1, 2]
print(a[3]) ## 인덱싱 오류가 먼저 발생
3/0
except ZeroDivisionError as e:
print(e)
except IndexError as e:
print(e)
>>>list index out of range
- 2개 이상의 오류를 동시에 처리하려면 아래와 같이 괄호를 묶어서 처리한다.
try:
a = [1, 2]
print(a[3])
3/0
except (ZeroDivisionError, IndexError) as e:
print(e)
>>> list index out of range
(2) try, finally문
- finally절은 try문 수행 도중 예외 발생 여부에 상관없이 항상 수행
f = open('test.txt', 'w')
try:
...
finally:
f.close()
(3) pass : 오류 회피하기
try:
f = open("missing", 'r')
except FileNotFoundError:
pass ## 파일이 없더라도 오류를 발생하지 않고 통과
(4) raise : 오류 발생시키기
## dog클래스를 상속받는 자식클래스는
## 반드시 barking이라는 함수를 구현하도록
## 강제하고 싶은 경우
class dog: ## 1) dog 클래스에
def barking(self): ## 2) barking 이라는 함수 생성
raise NotImplementedError ## 3) 함수를 사용하려하면 NotImplementedError 발생
class Bulldog(dog): ## 1) bulldog클래스는 dog클래스를 상속받음
pass
bulldog = Bulldog()
bulldog.barking()
- 위 예시에서 에러를 발생시키고 싶지 않다면 Bulldog 클래스에 barking 함수를 반드시 구현해야 한다.
class dog: ## 1) dog 클래스에
def barking(self): ## 2) barking 이라는 함수 생성
raise NotImplementedError ## 3) 함수를 사용하려하면 NotImplementedError 발생
class Bulldog(dog): ## 1) bulldog클래스는 dog클래스를 상속받음
def barking(self):
print("bark, bark")
bulldog = Bulldog()
bulldog.barking()
>>> "bark, bark"
(5) 예외 만들기
- 에러 발생
class MyError(Exception):
pass
def say_paul(paul):
if paul == 'nerd':
raise MyError()
print(paul)
say_paul("genius")
say_paul("nerd")
>>> genius
>>> Traceback (most recent call last):
>>> File "...", line 10, in <module>
>>> say_paul("nerd")
>>> File "...", line 6, in say_paul
>>> raise MyError()
>>> __main__.MyError
- 에러 예외처리 → MyError 클래스
class MyError(Exception):
pass
def say_paul(paul):
if paul == 'nerd':
raise MyError()
print(paul)
try:
say_paul("genius")
say_paul("nerd")
except MyError:
print("잘못된 별명")
>>> genius
>>> 잘못된 별명
- 에러 예외처리 → MyError 클래스, 에러 발생시 저장된 오류메시지 사용
class MyError(Exception):
def __str__(self): ## 오류메시지를 보이게 하려면 __str__메서드 사용
return "잘못된 별명"
def say_paul(paul):
if paul == 'nerd':
raise MyError()
print(paul)
try:
say_paul("genius")
say_paul("nerd")
except MyError as e:
print(e)
>>> genius
>>> 잘못된 별명
'DEV > 파이썬 이론' 카테고리의 다른 글
파이썬 코딩 :: 파이썬 map, filter, lambda (0) | 2022.09.02 |
---|---|
파이썬 코딩 :: 파이썬 문법, 알고리즘_TIL#04 (0) | 2022.09.01 |
파이썬 코딩 :: 파이썬 튜플(tuple), 집합 (0) | 2022.09.01 |
파이썬 코딩 :: 파이썬 딕셔너리(Dictionary) 문법, 예제 (0) | 2022.08.15 |
파이썬 코딩 :: 파이썬 list 자료형 문법(수정, 연산 메소드) (0) | 2022.08.15 |
댓글