본문 바로가기
CS/Python

[파이썬 개발자 로드맵] Exceptions - Python 에서 예외(Exception)를 일으키고 처리하는 방법 , try ... except ... else 의 의미

by Warehaus 2022. 7. 2.

파이썬 개발자 로드맵에 따라 문법들을 정리하고 있습니다.

 

2022.04.27 - [CS/Python] - python 개발자 로드맵 ( developer roadmap ) 에 따라서 개발공부하기

 

python 개발자 로드맵 ( developer roadmap ) 에 따라서 개발공부하기

예전에 DevOps 업무를 수행하기 위해서 어떤 능력이 필요한지 roadmap.sh 에서 확인해 본 적이 있다. 파이썬을 현업에서 적극적으로 사용하고 있지만 가끔 기본적인 내용에 대해 엦어버릴 때가 있는

armin.tistory.com

 

오늘은 예외 처리에 대해 간단하게 정리하고 넘어가 보겠습니다.

 

Handling exceptions

 

다른 언어들과 마찬가지로 파이썬 에서는 선택 된 예외들을 처리할 수 있습니다.
다음과 같이 try ... except 구문(statement) 으로 예외를 처리하시면 됩니다.

try:
    t = 3
    t / 0
except Exception:
    print ( "ERROR" )

위 코드는 0 으로 나누는 연산으로 인해 예외( division by zero )가 발생합니다.

Python 에서 try 문은 다음과 같이 동작합니다.

  1. try 에서 시작하여 except가 나오는 사이의 코드를 모두 실행합니다.
  2. 실행 상에서 예외가 발생하지 않으면, except 절에 구현 된 내용은 무시하고 try 구문을 종료합니다.
  3. try ~ except 사이의 코드를 실행하면서 예외가 발생하는 경우, except 에서 처리하고 있는 예외 이름과 try 문에서 발생한 예외가 동일한 유형인지 확인 후 처리하고자 하는 Exception인 경우에, except 절을 실행합니다.
  4. except 에서 매칭되는 예외가 없는경우, unhandled exception으로 여겨져 except 절의 처리를 수행 하지 않습니다.

 

기본적인 동작은 그렇고, 위의 코드에서 Exception은 모든 예외를 잡아줍니다. 특정 예외를 잡고싶은 경우, 처리하고자 하는 예외 명을 정확히 명시합니다. 예외는 보통의 상황에서는 파이썬에 내장 된 예외 를 사용하는데요, 아래 링크를 참고하시면 도움이 될 것 같습니다.

https://docs.python.org/3/library/exceptions.html#exception-hierarchy

 

Built-in Exceptions — Python 3.10.5 documentation

Built-in Exceptions In Python, all exceptions must be instances of a class that derives from BaseException. In a try statement with an except clause that mentions a particular class, that clause also handles any exception classes derived from that class (b

docs.python.org

 

반응형

else

try ~ except 는 알겠는데, 가끔 코드를 보다보면 else 가 나옵니다.  필요에 따라 선택적으로 사용이 가능한 녀석인데요, else block안에 구현 된 코드들은 try 구문에서 예외가 발생하지 않은 경우 실행됩니다.

try:
    t = 3
    t / 0
except Exception as e:
    print ( "ERROR" )
    print ( e )
else:
    print ( "GOGO" )

위 코드처럼 구현하면 예외처리가 되고, "GOGO" 는 출력되지 않습니다.

그냥 try 안에 구현해도 되는 것을 왜 굳이 else를 써야하나 ? 라는 생각을 하실지도 모르겠습니다.
try 안에 모든 코드를 구현하는 것 대비 더 좋은 점이 있을까요? 아래와 같이 구현할 수 있는데 말이죠.

try:
    t = 3
    t / 0
    print ( "GOGO" )
except Exception as e:
    print ( "ERROR" )
    print ( e )

별건 아닌 것 같지만 else 는 꽤나 유용하게 사용될 수 있습니다.

예시 코드는 모든 Exception을 핸들링 하고 있기 때문에 사실 상 else 를 굳이 사용할 필요는 없겠습니다. 다만, 예외의 종류를 다음과 같이 바꿔보면 얘기가 달라집니다.

try:
    t = 3
    t / 0
except ZeroDivisionError:
    print ( "ERROR" )
    print ( e )
else:
    print ( "GOGO" )

except 문은 ZeroDivisionError 만 처리를 하고 다른 예외들은 처리하지 않습니다. 이런 경우, except 에서 처리되지 않는 예외가 try 안에서 발생하는 것들을 피하기 위한 목적으로 else를 사용하게 되는 것 입니다.

즉, else 의 목적은 except 에서 핸들링 하지 않는 보호되지 않는 코드를 else로 따로 빼 두기 위해 사용하는데 있습니다.