Python/내장함수&기타

[Python/내장함수] 예외 처리하기 (try / except문)

(Python) 예외 처리하기 (try 와 except문)

[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문을 사용하면 된다.
1
2
3
4
5
6
7
8
9

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")
1
2
3
4
5
list index out of range
list index out of range
list index out of range
list index out of range
list index out of range
In [7]:
# 이번엔 ValueError에 대해서도 해보자.

a = [1,2,3,4,5]
a.index(10) #리스트 a에서 10이라는 item의 인덱스 위치를 반환한다.
            #하지만, 리스트a에는 10이 없기 때문에 에러가 발생!
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-7-dd96be22e3e8> in <module>
      2 
      3 a = [1,2,3,4,5]
----> 4 a.index(10) #리스트 a에서 10이라는 item의 인덱스 위치를 반환한다.
      5             #하지만, 리스트a에는 10이 없기 때문에 에러가 발생!

ValueError: 10 is not in list
In [8]:
# 위 경우에 대해서 try/except문을 활용해보자

a = [1,2,3,4,5]
try:
    print(a.index(10))
except ValueError:
    print("10 is not in list")
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")
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-9-40b7b4bfab2e> in <module>
      3 a = [1,2,3,4,5]
      4 try:
----> 5     print(a.index(10))
      6 except IndexError:
      7     print("IndexError")

ValueError: 10 is not in list
  • "except:" 만 할 경우, 모든 에러를 처리해준다.
  • "except 특정에러:" 를 할 경우, 해당 특정 에러만을 잡아준다.
    만약 발생한 에러가 해당 에러가 아닐 경우, 에러 처리를 못하기 때문에 그대로 에러가 발생한다.