[Python] 예외 처리하기¶
- 일단 코드부터 실행하고, 에러가 발생하면 그때 처리한다!
- 코드와 프로그램 논리를 추가해서 나쁜 일이 생기지 않도록 사전에 막기보다는,
파이썬의 예외 처리 메커니즘을 이용해서 일단 에러가 발생하도록 놔두고,
에러가 발생하면 이를 발견해서 복구할 수 있는 기회를 제공한다
- 발생할 수 있는 모든 에러를 처리하는 코드를 만들려면 코드 작성에 많은 시간이 걸리기 때문에 예외처리는 많은 도움이 된다.
- 보호해야할 필요가 있는 부분은 어디일까? 고민!
- 런타임에 발생하는 에러에 상관없이 그것을 무시하거나 에러 메세지를 출력하도록 하므로 모든 에러가 처리된다. 범용적이라 좋긴 한데..
실제로 신경써야 하는 에러는 IOError와 ValueError이다.
프로그램을 개발할 때 실제로 일어나는 에러는 대체로 이 두 종류이기 때문.
이것 외에도 다른 어떤 에러가 발생하는지 알아야 한다면, 너무 범용적으로 처리가능한 try/except를 이용하는 것이 부적절한 방법이 될 수도 있다.
try/except 메커니즘¶
파이썬에는 try문이 있는데, try문을 통해서 런타임에 발생하는 예외나 오류를 잡아낼 수 있다.
- try : 런타임 에러를 발생시킬 가능성이 있는 코드
- except : 에러 복구 코드
In [5]:
## try/except, pass문을 적절히 활용해보자
# pass : 파이썬에서의 빈(empty, null)문장으로서, 아무런 처리도 하지 않는다
# 인덱스 에러가 발생하는 경우에 대해서 테스트 해보자!
a = [1,2,3,4,5,6,7,8,9]
for i in range(20):
try:#에러로부터 보호되는 코드부분
print(a[i])
except: #에러가 발생하면 실행되는 부분
pass #그냥 지나가고 싶다면, pass문을 사용하면 된다.
try/excet는 런타임 에러의 종류에 상관 없이 모두 무시하기 때문에!
런타임 에러가 발생했을 때 except에 의해 처리가 된다.
하지만 우리가 원하는 처리가 아닐수도 있다는 점을 유념해야 한다!!
그렇다면 특정 예외만 처리하도록 할 순 없을까?¶
In [6]:
# 만약 예외 처리 코드가 특정한 에러만을 고려하여 처리하도록 하고 싶다
# 그러기 위해선, except문에 에러 종류를 지정해주면 된다!
# 에러 종류를 지정하게 되면, 예외 처리 코드가 범용에서 특정형으로 바뀌기 때문이다
a = [1,2,3,4,5]
for i in range(10):
try:
print(a[i])
except IndexError: ##인덱스 벗어나는 에러를 잡았을 경우에 대해서만!
print("list index out of range")
In [7]:
# 이번엔 ValueError에 대해서도 해보자.
a = [1,2,3,4,5]
a.index(10) #리스트 a에서 10이라는 item의 인덱스 위치를 반환한다.
#하지만, 리스트a에는 10이 없기 때문에 에러가 발생!
In [8]:
# 위 경우에 대해서 try/except문을 활용해보자
a = [1,2,3,4,5]
try:
print(a.index(10))
except ValueError:
print("10 is not in list")
In [9]:
# 만약에 except문에 ValueError가 아닌 다른 Error를 쓰면 어떻게 될까?
a = [1,2,3,4,5]
try:
print(a.index(10))
except IndexError:
print("IndexError")
- "except:" 만 할 경우, 모든 에러를 처리해준다.
- "except 특정에러:" 를 할 경우, 해당 특정 에러만을 잡아준다.
만약 발생한 에러가 해당 에러가 아닐 경우, 에러 처리를 못하기 때문에 그대로 에러가 발생한다.
'Python > 내장함수&기타' 카테고리의 다른 글
[Python/내장함수] lambda, map, filter, reduce 함수 사용법 (0) | 2020.04.19 |
---|---|
[Python/기타] 알고리즘(set을 이용한) 시간초과에 도움이 되는 팁 (0) | 2020.03.14 |
[Python/기타] 파이썬 시간 복잡도(Time Complexity) (0) | 2020.02.26 |
[Python/내장함수] range와 enumerate 함수 (0) | 2020.01.02 |
[Python/내장함수] isinstance 함수 (0) | 2020.01.02 |