2007/06/06 22:35
Dev 노트
이번 포스팅은 파이썬으로 프로그래밍할때 유용하게 사용될수 있는 간단한 팁 되겠습니다.
파이썬 중급자 이상이시라면 큰 도움은 안될지도 모르겠군요;;;
프로그래밍을 하다보면, 디버그가 까다로운 환경을 만날일이 종종 있습니다. stdout이나 stderr로 프린트를 해보면서 디버그하는 방법조차 사용하기 힘든 환경 말이죠.. 큰 프로그램도 아닌데 pdb(gdb인터페이스의 파이썬 디버거)같은 디버거로 찍어보면서 찾기도 귀찮기도 하고 그럴때가 있습니다. 그리고 굳이 그럴 때가 아니더라도, 프로그램이 어디서 무슨 오류가 발생하여 죽어버린건지 알아내야 하는 경우가 많이 있습니다.
CGI로 만들때나, 로그파일 등에 중요한 정보를 남겨 디버그 하는게 최선책이라고 여겨지는 빠르고 작고 짧은 개발에 있어서는 더욱이, exception의 traceback정보가 아주 유용한, 그리고 거의 유일하다시피한 디버그 정보로 활용됩니다. (traceback은 call-stack에 대한 description을 포함하는 자료입니다) 이럴 때에 한번 돌려보고, 상황 발생시에 traceback을 문자열로 얻어와 파일이나 출력 방향에 저장해 두었다가 분석해 보는 것입니다.
위와 같은 0으로 나누는 오류가 발생했을때, ZeroDivisionError가 발생했고 발생한 위치가 어디인지를 알아야지만 다시 그곳에서 그 오류가 발생하여 프로그램이 죽어버리는 일을 방지할 수가 있을 것입니다. 하지만 위의 예제는 파이썬의 interactive mode에서 일어난 exception이고, 파이썬 프로그램을 작성하여 별도로 돌리고 있을때, 특히 백그라운드에서 돌아가는 데몬 등의 프로세스를 만들었을 경우에는 아무 통보 없이 죽어버린 프로세스로 당황할 지도 모릅니다. 그래서 프로그램의 주요부(죽지 말아야 할 곳)에서 try-exception구문을 쓰고 traceback모듈을 이용하여 오류 내용과 위치 및 오류 당시의 기본적인 상황(?!)을 가져오는 것입니다.
traceback역시 잘 포장된 object이기 때문에 내용을 까서 보는데 사용되는 방법이 따로 있습니다. 바로 traceback 모듈을 사용하는 것입니다.
우선 traceback을 import해봅시다.
그리고 help(traceback)해봅시다. 사용법과 함수목록을 얻을 수 있습니다.

너무 설명이 잘 나와있어서 하나하나 자세한 설명은 빼겠습니다.
이 모듈은 주로 traceback을 다루는 함수들로 구성되어 있습니다.
exception이 발생했을때(try-except 구문에서 except 블럭으로 진입했을 때), exception type, value, traceback 세가지 objects로 exception이 표현되는데, 이들을 가장 간편하게 가져오는 방법은 sys module에서 제공합니다.
sys.exc_info() 함수입니다.

아주 간단하지만 무진장 유용한 예제를 하나 소개하도록 하는 것으로 정리하겠습니다.
traceback.format_exception()함수를 이용하여 traceback과 exception type, value를 문자열의 리스트로 얻어오는 예제입니다. traceback.format_exception()함수가 리턴하는 리스트는 한 라인당 한 엘리먼트가 되며, 각 엘리먼트는 라인끝문자를 포함하고 있습니다.

다 써놓고 보니 설명이 깔끔하지 못한거 같군요.. 질문 환영^^;;
파이썬 중급자 이상이시라면 큰 도움은 안될지도 모르겠군요;;;
프로그래밍을 하다보면, 디버그가 까다로운 환경을 만날일이 종종 있습니다. stdout이나 stderr로 프린트를 해보면서 디버그하는 방법조차 사용하기 힘든 환경 말이죠.. 큰 프로그램도 아닌데 pdb(gdb인터페이스의 파이썬 디버거)같은 디버거로 찍어보면서 찾기도 귀찮기도 하고 그럴때가 있습니다. 그리고 굳이 그럴 때가 아니더라도, 프로그램이 어디서 무슨 오류가 발생하여 죽어버린건지 알아내야 하는 경우가 많이 있습니다.
CGI로 만들때나, 로그파일 등에 중요한 정보를 남겨 디버그 하는게 최선책이라고 여겨지는 빠르고 작고 짧은 개발에 있어서는 더욱이, exception의 traceback정보가 아주 유용한, 그리고 거의 유일하다시피한 디버그 정보로 활용됩니다. (traceback은 call-stack에 대한 description을 포함하는 자료입니다) 이럴 때에 한번 돌려보고, 상황 발생시에 traceback을 문자열로 얻어와 파일이나 출력 방향에 저장해 두었다가 분석해 보는 것입니다.
exception발생 메세지(interactive mode)
traceback역시 잘 포장된 object이기 때문에 내용을 까서 보는데 사용되는 방법이 따로 있습니다. 바로 traceback 모듈을 사용하는 것입니다.
우선 traceback을 import해봅시다.
그리고 help(traceback)해봅시다. 사용법과 함수목록을 얻을 수 있습니다.
help(traceback)
너무 설명이 잘 나와있어서 하나하나 자세한 설명은 빼겠습니다.
이 모듈은 주로 traceback을 다루는 함수들로 구성되어 있습니다.
exception이 발생했을때(try-except 구문에서 except 블럭으로 진입했을 때), exception type, value, traceback 세가지 objects로 exception이 표현되는데, 이들을 가장 간편하게 가져오는 방법은 sys module에서 제공합니다.
sys.exc_info() 함수입니다.
help(sys.exc_info)
아주 간단하지만 무진장 유용한 예제를 하나 소개하도록 하는 것으로 정리하겠습니다.
traceback.format_exception()함수를 이용하여 traceback과 exception type, value를 문자열의 리스트로 얻어오는 예제입니다. traceback.format_exception()함수가 리턴하는 리스트는 한 라인당 한 엘리먼트가 되며, 각 엘리먼트는 라인끝문자를 포함하고 있습니다.
traceback을 문자열로 얻어내는 예제
다 써놓고 보니 설명이 깔끔하지 못한거 같군요.. 질문 환영^^;;


