전문적으로 Python으로 개발하지 않더라도 Python으로 이것저것 개발하거나 혹은 인터넷이나 Github상에서 다운로드한 소스코드를 동작해야 할 일이 꽤 많을 것이다.  그럴때 아래와 같이 잘 예외 처리가 된 코드를 보았다고 생각해 보자..


    lineList = []

    try:

        f = open(fileName, 'r', encoding='latin-1')


    except IOError:

        print("[!] Could not open file " + fileName)

        exit(1)


    except:

        print("[!] Could not access file " + fileName)

        exit(1)


    for line in f.readlines():

        newLine = line.replace('\n', '')

        lineList.append(newLine)


  단지 파일의 내용을 읽은 다음 단순히 리스트에 하나씩 넣어주는 단순한 코드 이다.

 근대 위의 코드를 실행해 보면 아래와 같이 에러가 난다.



[!] Could not access file ./usernames.txt


예외처리가 되어 있어 아무런 에러 메시지가 나지 않는다. 제일 쉬운 에러 메시지를 보는 방법은 try, except를 모두 제거 해버리면 된다. 그러나 열심히 짜둔 코드를 에러 하나 보겠다고 즉 Stack Trace 하나 하겠다고 지우고 다시 짜기엔 귀차니즘이 용납하지 않는다. 이럴때 에러 로깅을 한가지 넣어서 해결 해 보자.


아래와 같이 코드를 수정한다.


    import traceback

    lineList = []

    try:

        f = open(fileName, 'r', encoding='latin-1')


    except IOError:

        print("[!] Could not open file " + fileName)

        traceback.print_stack()

        traceback.print_exc()

        exit(1)


    except:

        print("[!] Could not access file " + fileName)

        traceback.print_stack()

        traceback.print_exc()

        exit(1)


    for line in f.readlines():

        newLine = line.replace('\n', '')

        lineList.append(newLine)


   위와 같이 변경하고 나면 아래와 같이 encoding이 잘못된 키워드로 함수내에 정의되었다는 에러 메시지를 볼수 있다.


TypeError: 'encoding' is an invalid keyword argument for this function


  위에서 사용한 traceback은 python상에서 위와 같이 예외처리등이 수행된 상태에서 Stack Trace를 출력하기에 상당히 유용한 모듈이다. 상세한 설명은 아래의 링크를 참고하기 바란다.


https://docs.python.org/2/library/traceback.html


This module provides a standard interface to extract, format and print stack traces of Python programs. It exactly mimics the behavior of the Python interpreter when it prints a stack trace. This is useful when you want to print stack traces under program control, such as in a “wrapper” around the interpreter





+ Recent posts