Reputation: 2453
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: ()
Upvotes: 6
Views: 2196
Reputation: 5958
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.
Upvotes: 6