티스토리 뷰

예외처리란 무엇일까요?

코드 상에서는 문법적으로 정확하지만 에러가 발생하는 것을 예외라고 하며 그러한 예외들을 처리하는 것을 예외처리라고 합니다. 다양한 예외들이 존재하고, 예외가 발생하면 프로그램이 작동을 멈추게 되지만, 예외처리를 통해 계속 진행시킬 수 있게 만들어 줍니다.

예외처리를 하는 코드는 어떻게 생겼을까요?

try: #실행할 코드 except 발생오류: #오류발생 시 처리할 코드


try ... except ... 문을 통해서 예외처리를 할 수 있습니다. except 뒤에는 예상되는 발생오류의 이름을 적습니다. 쉬운 예를 하나 들어서 직접 사용해보도록 하겠습니다. 파이썬 인터프리터에 2/0을 실행하면 어떤 에러가 발생할까요?


Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ZeroDivisionError: division by zero


위의 소스코드와 같은 ZeroDivisionError가 발생합니다. 해당 에러는 0으로 나눌 때 생기는 에러입니다. 이제는 예외처리를 통해서 다른 경고음을 주도록 하겠습니다.


try:
    2/0
except ZeroDivisionError:
    print("0으로 나눌수는 없습니다.")


해당 소스코드를 실행하면 "0으로 나눌수는 없습니다"라는 경고음이 나타납니다. 즉 바로 에러로 인해 프로그램이 멈춘 것이 아니라 우리가 처리한 상황으로 넘어가서 프로그램이 멈추지 않게 됩니다.

예외의 종류

아주 다양한 예외들이 있습니다. IndexError, KeyError, NameError, UnicodeError, ZeroDivisionError 등 이것들 뿐만 아니라 그 많은 예외들을 다 알아야할까요? 대부분은 Eception으로 처리가능하며 여러부분으로 세분화 할 때는 필요 시에 검색을 통해서 알아보시면 충분합니다.

try:
    #처리할 구문
except ZeroDivisionError:
    #예외 발생시 실행할 구문
except NameError:
    #예외 발생시 실행할 구문
except (IndexError, KeyError):
    #예외 발생시 실행할 구문


여러가지의 예외처리를 할 경우엔 위와 같이 하시면 됩니다. 제일 먼저 발생되는 에러에 따라 구문이 실행됩니다.


IndexError와 KeyError가 발생했을 땐 같은 구문이 실행됩니다.

예외 직접 만들기

상황에 따라서는 예외를 직접 만들어야 할 수도 있습니다. 직접 예외를 만드는 방법은 클래스에서 Exception을 상속 받으면 됩니다. 

class makeError(Exception):
    def __str__(self):
        return "에러가 발생했습니다."

#False를 넣으면 에러가 발생하는 함수입니다.
def test(bool):
    if(bool):
        print("에러가 발생하지 않았습니다.")
    else:
        raise makeError()

test(True)
test(False)


makeError라는 클래스는 Exception을 상속받은 제가 만든 에러입니다. test라는 함수에 False를 전달하면 에러가 발생합니다. raise는 에러를 강제로 일으키는 명령어입니다. 즉 스스로 에러를 만들어서 처리등을 할 수 있다는 말입니다. 상황에 맞게 에러를 일으켜서 연습해보세요!

좀 더 나아가기

이해가 안되는 부분이 있을수도 있습니다만 좀 더 알아보도록 하겠습니다. try ... except ... 와 함께 쓸 수 있는 구문들은 else와 finally 그리고 as가 있습니다.

try:
    test(True)
except makeError as e:
    print(e)
else:
    print("에러가 나지 않았습니다.")
finally:
    print("에러에 상관없이 실행됩니다.")


else는 try구문에서 에러가 발생하지 않았을 때 실행됩니다. 즉 에러가 발생할 경우에는 실행되지 않습니다. finally는 에러의 발생과 상관없이 꼭 실행되는 구문입니다. except 구문에 as는 에러 발생시 구문을 뒤의 변수로 받습니다. 즉 e에는 우리가 makeError에 정의한 "에러가 발생했습니다."라는 구문이 들어가게 됩니다. test()함수에 False를 전달해보세요! 결과가 어떻게 달라지나요?



다음 포스팅에서는 우리가 배운 것들로 단어테스트 프로그램을 만들어보도록 하겠습니다.



공감은 제작자에게 큰 힘이 됩니다.


댓글