[Python] try-except-else-finally


파이썬에서 예외처리를 위하여

try - except 문을 많이 사용해왔다.

 

이번 포스트에서는 try-except 예외처리를 정리하며

추가로 else-finally를 사용해

코드를 더 효율적으로 구현하는 것 또한 배워보겠다.

 

우선, 간략하게 설명하자면 다음의 순서와 같이 진행된다.

더보기

오류 발생 x : try → else finally

오류 발생 o : try except finally

 

1. 다음 예시를 보도록 한다.

def division(a, b):
    try:
        result = a / b
        return result
    except:
        print("error!")

division(50, 0)
error!

분모가 0이 될 수 없어 오류가 발생하며,

try문은 실행되지 않고 error를 출력한다.

이렇게 하면, 정확히 어떤 error인지 알 수 없다는 문제점이 있다.

 

 

2. 두번째 예시이다.

except 라인에 Exception을 지정하고 raise를 적용했더니 Full 에러 메시지가 출력되었다.

def division(a, b):
    try:
        result = a / b
        return result
    except Exception as e:
        raise e

division(50, 0)
---------------------------------------------------------------------------
ZeroDivisionError                         Traceback (most recent call last)
<ipython-input-2-ff9adf176e17> in <module>()
      6         raise e
      7 
----> 8 division(50, 0)

1 frames
<ipython-input-2-ff9adf176e17> in division(a, b)
      4         return result
      5     except Exception as e:
----> 6         raise e
      7 
      8 division(50, 0)

<ipython-input-2-ff9adf176e17> in division(a, b)
      1 def division(a, b):
      2     try:
----> 3         result = a / b
      4         return result
      5     except Exception as e:

ZeroDivisionError: division by zero

 

다음은 번외로 해보았다.

def division(a, b):
    try:
        result = a / b
        return result
    except ZeroDivisionError:
        print("ZeroDivisionError occurs!!")

division(50, 0)
ZeroDivisionError occurs!!

명확하게 "제로디비전에러"가 발생했을 때,

이에 대해 어떻게 처리할 것인지를 작성해놓았기 때문에

특정에러에 특화된 에러 처리를 보여주고 있다.

 

 

3. 세번째 예시는 finally구문을 추가하였다.

에러발생여부에 상관없이 실행하고픈 특정 구문이 있다면 finally 구문을 추가하면 된다.

def division(a, b):
    try:
        result = a / b
        return result
    except ZeroDivisionError:
        print("ZeroDivisionError occurs!!")
    finally:
        print("My division func is end")

division(50, 0)
ZeroDivisionError occurs!!
My division func is end

 

위의 결과를 보면,

에러가 발생하여 except문을 실행하였고 finally문 또한 실행되었음을 알 수가 있다.

def division(a, b):
    try:
        result = a / b
        return result
    except ZeroDivisionError:
        print("ZeroDivisionError occurs!!")
    finally:
        print("My division func is end")

division(50, 25)
My division func is end
2.0

위의 결과를 보면,

에러가 발생하지 않고 try문이 정상적으로 실행되었으며, finally문 또한 실행되었음을 알 수 있다.

따라서, finally문은 에러의 발생여부에 관계없이 실행됨을 알 수 있다.

 

※주의할 점 : try문이 finally문보다 순서에서 앞서있지만, 출력결과를 보면 return보다 print가 선후관계에서 앞서있음을 알 수 있다.

 

 

4. 네번째 예시에서는 else문을 추가하였다.

에러가 발생하지 않았을 때, 실행하고픈 구문이 있다면 else구문을 추가하면 된다.

def division(a, b):
    try:
        result = a / b
    except ZeroDivisionError:
        print("ZeroDivisionError occurs!!")
    else:
        return result
    finally:
        print("My division func is end")

division(50, 10)
My division func is end
5.0

에러가 발생하지 않았으므로 except문이 아닌 else문이 실행되었다.

 

 

결론

try문에는 에러발생의 위험이 있는 코드만 작성한 뒤,

나머지 코드들은 다른 구문들로 빼주는 것이 시간비용 측면에서 유리하다.

try문에서는 내부에서 에러 발생여부를 검사하므로 구문이 추가되면 로직 또한 추가되기 때문이다.

 

따라서, 각각 목적에 맞추어

  • 에러발생의 위험이 있는 코드는 try문으로
  • 에러가 발생하였을 때 실행하고픈 코드는 except문
  • 에러가 발생하지 않았을 때 실행하고픈 코드는 else문
  • 에러 발생여부에 관계없이 실행하고픈 코드는 finally문

으로 작성하도록 하는 것이 유리하다.

+ Recent posts