Get full traceback

前端 未结 5 1087
陌清茗
陌清茗 2020-12-12 22:55

How can i get full traceback in the following case, including the calls of func2 and func functions?

import traceback

def func():
         


        
5条回答
  •  执笔经年
    2020-12-12 23:10

    There's some more information that could be extracted from the traceback, and I sometimes prefer a neater, more 'logical' information instead of multi-line blob with files, line numbers and code snippetsgiven by traceback. Preferably one line should say all the essentials.

    To achieve this I use following function:

    def raising_code_info():
        code_info = ''
        try:    
            frames = inspect.trace()
            if(len(frames)):
                full_method_name = frames[0][4][0].rstrip('\n\r').strip()
                line_number      = frames[1][2]
                module_name      = frames[0][0].f_globals['__name__']
                if(module_name == '__main__'):
                    module_name = os.path.basename(sys.argv[0]).replace('.py','')
                class_name = ''
                obj_name_dot_method = full_method_name.split('.', 1)
                if len(obj_name_dot_method) > 1:
                    obj_name, full_method_name = obj_name_dot_method
                    try:
                        class_name = frames[0][0].f_locals[obj_name].__class__.__name__
                    except:
                        pass
                method_name = module_name + '.'
                if len(class_name) > 0:
                    method_name += class_name + '.'
                method_name += full_method_name
                code_info = '%s, line %d' % (method_name, line_number)
        finally:
            del frames
            sys.exc_clear()
        return code_info
    

    It gives . and line number, e.g.:

    (example module name: test.py):

    (line 73:)
    def function1():
        print 1/0
    
    class AClass(object):    
        def method2(self):
            a = []
            a[3] = 1
    
    def try_it_out():
        # try it with a function
        try:
            function1()
        except Exception, what:
            print '%s: \"%s\"' % (raising_code_info(), what)
    
        # try it with a method
        try:
            my_obj_name = AClass()
            my_obj_name.method2()       
        except Exception, what:
            print '%s: \"%s\"' % (raising_code_info(), what)
    
    if __name__ == '__main__':
         try_it_out()
    
    
    test.function1(), line 75: "integer division or modulo by zero"
    test.AClass.method2(), line 80: "list assignment index out of range"
    

    Which might be slightly neater in some use-cases.

提交回复
热议问题