Post List

2015년 8월 24일 월요일

Python 기초 #14 Exception Handling (예외처리)

앞서 #02에서 조건문을 설명하면서 간단하게 예외처리에 대해서 살펴보았는데, 이번 장에서는 좀 더 자세히 살펴보겠습니다.

1. 문법

try:
    ...
except:
    ...

앞서 #02에서 살펴본 가장 기본적인 문법입니다.

try:
    ...
except 발생에러 as 변수:
    ...
else:
    ...
finally:
    ...

각각의 발생 Error 별로 except를 여러개 사용이 가능합니다.
뒤에 as 변수 부분도 옵션인데 발생 Error를 변수에 넣어두고 except 절 안에서 사용이 가능합니다.
else 절에는 Exception이 일어나지 않은 경우에 실행되는 문장들을 적으면 됩니다.
finally는 Exception 발생 여부와 상관없이 무조건 실행됩니다.

2. 예제

가장 기본적인 구문부터 하나씩 살펴 보겠습니다.

- try ... except

try:
    1 / 0
except:
    print("Except : 1 / 0")

1 / 0 을 실행하여 Exception이 발생했으므로 print 문 안의 내용이 출력됩니다.

- try ... except as

try:
    1 / 0
except ZeroDivisionError as e:
    print(e)

위 Code에서는 ZeroDivisionError 오류를 e에 넣은 다음에 except 절 내에서 e를 출력하였습니다. 출력 결과는 다음과 같습니다.

division by zero

- try ... else

try:
    fHand = open('mbox.txt', 'r')
except FileNotFoundError as e:
    print(str(e))
else:
    sFile = f.read()
    f.close()

위 Code는 파일을 열기모드로 제어를 시도하는데 해당 File이 없어서 Exception이 발생한 경우에는 해당 오류를 출력하고, 아무런 Exception도 일어나지 않으면 File의 내용을 읽습니다.

- try ... finally

fHand = open('mbox.txt', 'w')
try:
    ...
finally:
    fHand.close()

파일을 쓰기모드로 열때는 오류가 잘 발생하지 않으므로 연 다음 작업들을 try 절에서 하는데, 예외가 발생하든 안하든 무조건 해당 절에서 나올때는 파일을 닫아주는 예제 입니다.

3. Passing Exception (예외 통과시키기)

특정한 예외가 발생한 경우에는 그냥 아무 처리도 안하고 통과시켜도 프로그램 상에 문제가 없을 경우가 있습니다. 이럴 경우에 아무런 예외처리도 해주지 않으면 해당 예외 발생시 프로그램이 종료가 되므로 그냥 통과시키도록 처리해 주면 됩니다.

try:
    fHand = open('mbox.txt', 'r')
except FileNotFoundError:
    pass

파일을 읽기모드로 여는데 파일이 없더라도 그냥 프로그램을 종료하지 않고 계속 수행하도록 예외를 통과시키는 예제입니다.

4. Raise Exception (예외 발생시키기)

프로그래머에 의해서 강제로 예외를 발생시키는 방법입니다.
C++, Java의 throw와 같은 기능이라고 생각하시면 됩니다.

Java의 Interface 같은 경우 특정 함수들을 정의하지 않으면 안되는 경우가 있습니다.
팀으로 프로젝트 진행시 이럴 경우 함수 내부에 구현되지 않았다는 오류발생 Code를 넣은 뒤 배포해서 다른 사람이 구현을 하도록 하게 하는 방법을 많이 사용합니다.

class calc:
    def Add(self, n1, n2):
        raise NotImplementedError
 
class calcEx(calc):
    def Sub(self, n1, n2):
        return n1 - n2= calcEx()
>>> print(A.Sub(2,1))
1
>>> print(A.Add(2,1))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 3, in Add
NotImplementedError

댓글 없음:

댓글 쓰기