파이썬 프로그래밍의 기초: 예외 처리

2018. 2. 2. 16:59Python-이론/python

예외 처리



프로그램을 작성하다 보면 오류가 발생할 때가 많다. 하지만 같은 코드임에도 상황에 따라 오류가 발생할 때도 있고 발생하지 않을 수 도있다. 오류가 발생때를 무시하고 오류가 발생할 때 안발생할때 모두 실행되게 하고 싶다면 예외처리를 사용하면된다.



오류 예외 처리 기법



try, except문

try, except문의 기본 구조이다.

try:
    ...
except [발생 오류[as 오류 메세지 변수]]:
    ...

try블록의 코드가 실행중에 오류가 발생하면 except 블록이 수행된다. try블록에 오류가 발생하지 않는다면 except 블록은 수행되지 않는다.


위의 사용방법에서 []쳐져 이는 것은 생략이 가능하다는 말이다. 따라서 사용할 수 있는 방법이 여러가지가 있다.


1. try, except만 쓰는 방법
try:
    ...
except:
    ...

이 방법은 어떤 오류가 발생하든 except문을 수행한다.


2. 발생 오류만 포함한 except문
try:
    ...
except 발생오류:
    ...

이 경우는 오류가 발생했을 때 except구문에서 미리 정해 놓은 오류 이름과 일치할 때만 except 블록을 수행한다는 뜻이다.


3. 발생 오류와 오류 메세지 변수까지 포함한 except 문
try:
    ...
except 발생 오류 as 오류 메세지 변수:
    ...


try....else

try 문은 else 절을 사용할 수 있다. else절은 except 절이 실행되지 않는 경우에 실행되면 반드시 except절 바로 다음에 위치해야한다.


try:
    f = open("victory",'r')
except FileNotFoundError as e:
    print(str(e))
else:
    data = f.read()
    f.close()

except가 실행되지 않으면 else밑의 구문이 실행되고 반드시 except 밑에 있어야한다.


try.. finally

finally는 오류가 발생하든 말든 무조건 실행된다.

f = open('foo.txt','w')
try:
    # 코드
finally:
    f.close()


오류 회피하기


프로그램을 하다가 오류가 발생하는 경우 그냥 무시하고 통과하고 싶을때가 있다. 이때는

try:
    f = open("나없는 파일",'r')
except FileNotFoundError:
    pass
이런식으로 사용하면된다.



오류 고의로 발생시키기



오류를 고의로 발생시키려면 raise함수를 사용 해주면 된다. raise 오류명


부모 클래스에서 오류가 발생하게 만들어 둔뒤 이클래스를 상속한 자식 클래스에서 무조건 오버라이딩을 유도하게 코드를 작성할 수 있다.



오류 만들기



프로그램을 수행 도중 고의로 오류를 만들 수 있다. 방법은 클래스를 만든 뒤에 Exception이라는 클래스를 사속받으면 된다.


class MyError(Exception):
    pass

def john(nick):
    if (nick =='바보'):
        raise MyError()
    else:
        return "천사"


print(john('천사'))
print(john('바보')) 



try...catch...문과 함께 사용하기



class MyError(Exception):
    pass

def john(nick):
    if (nick =='바보'):
        raise MyError()
    else:
        return "천사"

try:
    print(john('천사'))
    print(john('바보'))
except:
    print("바보가 아닙니다.")



try....catch as문과 오류메세지를 만들어서 보내기

try:
    print(john('천사'))
    print(john('바보'))
except MyError as e:
    print(e)

e에 메세지를 자기가 저장해서 호출하고 싶다면 어떻게 해야할까? 내장 함수중에 __str__을 사용하면 된다.

class MyError(Exception):
    def __init__(self, message):
        self.msg = message
    def __str__(self):
        return self.msg

형태로 사용해주면 된다.