简体   繁体   中英

Get last function's arguments from traceback?

I read Get last function's call arguments from traceback? but it is not specific enough to answer my problem.

This is really bothering me since not having the call arguments is slowing me down and I am pretty sure that it is possible to get this kind of info from Python.

Here is an example to illustrate the problem:

# -*- coding: utf-8 -*-
import sys
import traceback
import inspect
import logging as log

def fl(x):
    # exception is happening here
    y = 5/x
    return y


def fm(x):
    return fl(x-3)


def fn(a, b, c=None):
    return fm(c)


def main():

    try:
        print fn(1, 2, c=3)
    except Exception as e:
        log.error('Unexpected problem.')
        log.error(e)
        traceback.print_exc()
        ### what I need to see is are the call arguments of the last / deepest call: ###
        ### def fl(x) was called with arguments: [(x, 3)]                            ###
        # this does not cut it:
        tb = sys.exc_info()[2]
        traceback.print_tb(tb)
        # this is broken:
        #frames = inspect.getinnerframes(tb)
        #log.error('Argvalues: %s', inspect.getargvalues(frames))
        # not sure:
        frames = inspect.trace()
        argvalues = inspect.getargvalues(frames[0][0])
        log.error('Argvalues: %s', inspect.formatargvalues(*argvalues))



if __name__ == '__main__':
    main()

so I get details, but the call arguments are not contained:

ERROR:root:Unexpected problem.
ERROR:root:integer division or modulo by zero
Traceback (most recent call last):
  File "sample.py", line 24, in main
    print fn(1, 2, c=3)
  File "sample.py", line 18, in fn
    return fm(c)
  File "sample.py", line 14, in fm
    return fl(x-3)
  File "sample.py", line 9, in fl
    y = 5/x
ZeroDivisionError: integer division or modulo by zero
  File "sample.py", line 24, in main
    print fn(1, 2, c=3)
  File "sample.py", line 18, in fn
    return fm(c)
  File "sample.py", line 14, in fm
    return fl(x-3)
  File "sample.py", line 9, in fl
    y = 5/x
ERROR:root:Argvalues: ()

frames[0][0] represents main function. main is called without arguments, thats why you get empty tuple. Change it to frames[-1][0] to get last frame.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM