본문 바로가기

파이썬 기초

[파이썬 코딩] 예외 처리 제대로 이해하기

파이썬 코딩 : 예외처리 제대로 이해하기

파이썬 프로그래밍 중에 수없이 많은 오류들을 경험해 보았을 것입니다. 프로그램 실행 중 발생하는 오류를 런타임 오류(Runtime error) 또는 예외(Exception)이라고 하는데 코드 실행 전에 들여 쓰기가 잘못되었거나 괄호 닫기가 안 되는 등 문법적인 문제가 있어 발생하는 오류인 문법 에러(Syntax error)와는 구분되는 개념입니다.

 

만약 코드 내에 문법 에러(Syntax error)가 있다면, 프로그램을 실행시켰을 경우 프로그램은 실행 자체가 되지 않으며 바로 오류 메시지를 출력하기 때문에 즉시 문법 에러의 존재 여부를 인지할 수 있습니다. 즉시 문제가 되는 오류를 해결할 수 있습니다.

 

하지만 런타임 오류(Runtime error) 또는 예외(Exception)는 프로그램을 실행 시 항상 발생하는 것이 아니라 오류  발생 조건이 일어났을 경우에만 발생하기 때문에 코드 개발을 어렵고 복잡하게 만드는 요인이 됩니다.

예를 들어 정수 2개를 입력받아서 단순히 더해주는 코드를 만들 때, 정수 2개를 정상적으로 입력한다면 아무런 문제 없이 동작하는 코드이지만 정수가 아닌 문자를 입력, 정수를 하나만 입력, 정수 2개를 한 번에 입력 등의 경우에는 런타임 에러가 발생하게 됩니다. 완벽한 코드를 만들기 위해서는 이러한 모든 조건을 고려하여 작성하여야 합니다.

 

파이썬에서 런타임 오류(Runtime error) 또는 예외(Exception) 처리를 위해서는 코드 실행 중 발생 가능한 오류를 사전에 예측하고 각각의 예외 조건에 대해서 처리를 해주는 방법과 try 구문은 사용하여 해결하는 방법이 있습니다.

 

try except 구문

try:
    런타임 오류 또는 예외가 발생 가능한 코드

except:
    런타임 오류 또는 예외가 발생하였을 경우 수행할 코드

try 절 내에 코드 수행 중 예외가 발생할 수 있는 모든 코드를 작성하고 except 절에는 만약 try 절 내에서 어떤 예외 사항이 발생되었는지는 알 수 없지만 예외사항이 발생하였을 때 실행할 코드를 작성하면 됩니다.

except 절에는 주로 예외사항을 알리기 위한 출력문 또는 pass라는 키워드를 사용하기도 합니다.

 

아래와 같이 리스트의 수를 모두 합하는 코드를 만들 때, 리스트의 네 번째 요소에 값이 없을 경우 수행 중에 ValueError이 발생하게 됩니다.

파이썬 에러 발생

 

이럴 경우 try except 문을 사용하고 except 절에는 pass 키워드를 사용하여 예외사항이 발생하였을 경우 다음 for 문을 수행하도록 하였습니다.

python try except 처리

 

try except 구문만 잘 사용하여도 동작 중 발생할 수 있는 예외처리를 할 수 있지만 코드의 간결성 및 다른 사람이 작성해놓은 파이썬 코드를 더 잘 이해하기 위해서는 몇 가지 추가적인 내용이 필요합니다. 

try except else 구문

try except 구문에서 예외가 발생하면 except 절을 수행하고 예외가 발생하지 않은 경우에는 특정 수행을 하기 위해서 else 구문을 추가할 수 있습니다.

try:
    예외가 발생 가능한 코드

except:
    예외가 발생하였을 경우 수행할 코드

else:
    예외가 발생하지 않을 경우 수행할 코드

 

만약 else 구문이 없다면 예외가 발생하였을 때와 발생하지 않았을 때의 처리를 구분하여 지정할 수가 없습니다.

 

try except finally 구문

try:
    예외가 발생 가능한 코드

except:
    예외가 발생하였을 경우 수행할 코드

finally:
    무조건 수행할 코드

finally 절에는 예외 발생 여부에 상관없이 항상 수행할 코드를 작성하는 부분이며 항상 try except문의 마지막에 위치해야 합니다.

try except else finally 조함도 가능하며 try finally 조합도 가능합니다.

 

예외 객체(Exception Object)

지금까지 살펴본 예외사항에서 모든 예외들은 예외가 발생하면 어떤 종류의 예외가 발생한 것인지 예외 정보가 예외 객체(Exception Object)에 저장됩니다. 여기에 저장된 정보를 활용하여 예외사항별 조치를 수행할 수 있는 코드를 작성할 수가 있습니다.

 

예외 객체를 활용하는 간단한 방법의 예제입니다.

흔히 볼 수 있는 예외 사항 중 ValueError과 IndexError에 대한 예외 처리 방법입니다.

except 뒤에 발생할 수 있는 예외 정보를 명시하여 해당 예외가 발생하였을 경우 수행할 코드를 각각의 except 절에 작성하면 됩니다.

try:
    예외가 발생 가능한 코드

except ValueError:
    ValueError이 발생하였을 경우 수행할 코드

except IndexError:
    IndexError이 발생하였을 경우 수행할 코드

else:
    예외가 발생하지 않을 경우 수행할 코드

 

위의 예제는 ValueError와 IndexError이 발생하면 예외처리가 가능하지만 그 외 TypeError가 발생하게 되면 프로그램은 강제 종료가 됩니다. 그러면 수십 개가 넘는 모든 예외의 종류에 대해서 처리해야 될까요?

파이썬에서는 Exception이라는 클래스(Class)를 이용하여 모든 예외를 처리할 수 있습니다.

 

따라서 특정 예외에 대해서는 위의 예제처럼 처리하고 마지막에 if 문의 else처럼 except Exception를 추가하여 정의되지 않은 예외 조건에 대해서는 일괄 처리를 할 수 있습니다.