본문 바로가기
PROGRAMMING/Python

[Python] 예외처리 (Exceptions)

by BLADEBONE 2011. 7. 2.
프로그램 실행에 있어 에러가 발생할 경우, 이에 대한 적절한 처리를 위해서 Python에서도 try, exception 구문을 통해서 예외처리를 수행할 수 있도록 지원하고 있다.

대표적인 예외처리 구문으로 '파일 불러 오기' 구문이 있다.

예를 들어 아래와 같이 존재하지 않는 파일을 불러올 경우 'IOError'가 발생함을 볼 수 있다.


>>> open('FileName', 'r')
Traceback (most recent call last):
   File "<stdin>", line 1, in <module>
IOError: [Errno 2] No such file or directory: 'FileName'


위와 같이 파일 불러오기 구문의 경우 실제 프로그램에서 에러가 자주 발생할 수 있는 부분으로 예외처리가 필수적이다.

Python에서는 아래와 같이 try, except 구문을 이용하여 예외처리를 수행할 수 있다.


try:
    ...
except [발생에러 [, 에러메시지변수]]:
    ...

<Type 1>

try:
    ...
except:
    ...

<Type 2>

try:
    ...
except 발생에러:
    ...

<Type 3>

try:
    ...
except 발생에러 , 에러메시지변수:
    ...


  • <Type 1>은 에러 종류에 상관없이 에러가 발생하기만 하면 except문 다음의 문장을 수행

 

  • <Type 2>는 발생한 에러가 except 문에서 정해놓은 에러와 같을 때만 except 문 아래의 문장을 수행

 

  • <Type 3>는 Type 2에서 에러메시지를 담을 변수를 생성하게 하는 방법이다.



예외처리 구문을 포함한 파일 불러오기 예제

fileName = 'FileName' # 불러올 파일 이름
try:
    open(fileName, 'r') #  읽기 모드(r)로 파일을 불러온다.
except IOError, e:
    print e
    print 'There is no "%s" file % fileName

실행결과:
[Errno 2] No such file or directory: 'FileOpen'
There is no "FileOpen" file



※ 에러 발생시키기 (raise)

raise는 일부러 에러를 발생시키기 위해서 사용하는 명령어로 경우에 따라서 어떠한 프로그래밍을 강제하기 위해서 사용할 수 있다. 예를 들어 클래스를 만들고 이를 상속받는 클래스에서 메소드를 반드시 구현하게 만들기 위해서는 아래와 같이 부모 클래스에서 raise를 이용할 수 있다.


>>> class Parent:
...    def mustMake(self):
...        raise NotImplementedError

>>> a = Parent()
>>> a.mustMake()
Traceback (most recent call last):
   File "<stdin>", line 1, in <module>
TypeError: unbound method mustMake() must be called with Parent instance as first argument (got nothing instead)

올바른 사용을 위해서는 아래와 같이 추가로 상속받는 클래스를 만들고 메소드를 구현해야 한다.

class Parent:
    def mustMake(self):
        raise NotImplementedError
   
class Child(Parent):
    def mustMake(self):
        print "mustMake() is made by Child class"

a = Child()
a.mustMake()

실행결과:
mustMake() is made by Child class



※ The class hierarchy for built-in exceptions

아래는 Python 자체 exception을 위한 발생에러 구조도이다. (URL: http://docs.python.org/library/exceptions.html )



반응형

댓글