예외 처리 (try, except)
코딩을 하다 보면 수없이 많은 에러가 난다. 오죽하면 "코딩 후 처음 실행(컴파일)시 에러가 없다면 그 자체가 에러다" 라는 소리도 있다. 물론 에러가 나는 이유는 해당 프로그램이
오동작 하지 않기 위한 프로그래밍 언어의 배려이다. 하지만 때로는 이런 에어를 무시하거나 에러가 날 때 적절한 처리를 하고 싶을 때가 있다.
이에 파이썬은 try, except 라는 것을 이용하여 에러를 처리할 수 있게 해준다.
일부러 에러 내기
우선 에러 처리 방법을 알기 전에 어떤 상황에서 에러가 나는지 일부러 만들어 보자. 우선 없는 파일을 열려고 시도해보자.
위에서 보듯이 없는 파일을 열려고 시도하면 "IOError"가 발생한다. 위에서 "없는파일"이 한글이기 때문에 마지막 처럼 (\xbe\xf8~~~) 깨져보이는 것으로
아직은 신경 쓰지 않아도 된다.
이번에는 많은 프로그래머들이 실수하는 부분으로 0으로 어떤 숫자를 나누는 경우에 발생한다.
0으로 x를 나누려 하니깐 ZeroDivisionError가 발생한다.
마지막으로 살펴볼 에러는 아마 가장 많이 일어나는 에러 중 하나이다.
a는 [0, 1, 2]라는 리스트인데 a[4]는 a 리스트에서 구할 수 없는 값이기 때문에 IndexError가 발생한다.
에러 처리하기
본격적으로 에러 처리 기법에 대해서 살펴보자. 다음은 에러 처리를 위한 try, except 문의 기본 구조이다.
try :
. . .
except [ 발생에러 [ , 에러메시지변수 ] ] :
. . .
try문 안에서 수행할 문장들이 에러가 나지 않는다면 except 문 다음의 문장들을 수행되지 않는다. 하지만 try에서 에러가 발생하면 except 부분이 수행된다.
except 문을 자세히 보자.
except [ 발생에러 [ , 에러메시지변수 ] ] :
위에서 보면 [ 발생에러 [, 에러메시지변수 ] ] : 는 생략이 가능하다는 전형적인 표기법이다.
즉 다음처럼 try, except만 써도 된다.
try :
. . .
except :
. . .
발생에러만 포함한 except를 써도 되고,
try :
. . .
except 발생에러 :
. . .
혹은 발생에러와 메시지 변수까지 포함한 except를 써도 된다.
try :
. . .
except 발생에러, 에러메시지변수 :
. . .
위의 3개 중에서 1가지를 선택하면 되는데
1 번째의 경우에는 에러 종류에 상관 없이 에러가 발생하기만 하면 except문 다음의 문장들이 수행된다.
2 번째의 경우에는 에러가 발생했을 때 except문에 미리 정해놓은 에러 이름과 일치할 때만 except문 다음의 문장들이 수행된다.
3 번째의 경우에는 2 번째 경우에다가 에러 메시지를 담은 변수 하나를 더 생성하게 하는 방법이다.
3번째 방법의 간략한 예제는 다음과 같다.
위처럼 4를 0으로 나누려고 하면 보나 마나 Zero~~가 발생하기 때문에 except문이 실행되고 위의 except문은 e 라는 메시지를 담은 변수를 출력시키기 때문에 위의 결과에서
보듯이 "integer ~~~" 라는 에러 메시지가 출력된다.
에러 처리하기 예제
실제적인 에러 처리의 예를 들어보기로 하자. 어떤 프로그램을 만들었는데 만약 파일이 존재하면 읽기 모드로 열고 존재하지 않으면 쓰기 모드로 여는 프로그램을
만든다고 가정해보자. 여러가지 방법이 존재하겠지만 try, except를 사용하면 다음과 같이 만들 수 있다.
위와 같이 하였을 때 try문을 먼저 실행하게 되는데 try문의 f = open ("없는파일.txt", 'r') 처럼 없는 파일을 읽기 모드로 열려고 하면 IOError가 발생하게 된다.
바로 이 에러가 나는 순간에 except문의 에러이름과 똑같은지를 판단하는데, 만약 에러 이름이 except문에서 정해놓은 에러 이름과 일치하면 except문 다음의 문장들을
수행하게 된다. 즉, 위에서 보면 "파일이 없기 때문에 쓰기 모드로 엽니다" 라는 문자열을 출력하고 "없는파일.txt" 라는 파일을 쓰기 모드로 열게 되는 것이다.
하지만, 실제 코딩을 하다 보면 위처럼 미리 에러를 예측하기가 쉽지 않다. 대부분의 에러 처리는 실제 프로그램을 작성하고 먼저 실행하고 이 때 발생되는 에러를 조사한 다음
try, except를 이용해서 에러 처리를 하게 된다
'Developing > Python_배우기' 카테고리의 다른 글
Python 13 - 라이브러리 (외장 함수) (0) | 2014.02.18 |
---|---|
Python 12 - 라이브러리 (내장 함수) (0) | 2014.02.15 |
Python 10 - 모듈 (1) | 2014.02.03 |
Python 09 - 클래스 (0) | 2014.01.26 |
Python 08 - 입/출력 (I/O) (0) | 2014.01.25 |