Issue 15128: inspect raises exception when frames are misleading about source line numbers (original) (raw)

The attached example shows how inspect.findsource fails when given a stack frame that points to a non-existent source line, and how inspect.getframeinfo and getinnerframes do not handle that failure.

On the one hand, yes, this code was asking for it by building such a broken frame. On the other hand, having code that examines tracebacks result in tracebacks of its own sucks a whole bunch.

The inspect find&get source methods are documented as returning IOError if they cannot find the source, and the calling code handles that case, so that's probably what should happen here.

(Actually, that seems straightforward enough, I can make a patch for that shortly.)

This may help with issue #1628987 as well.

I think this was fixed by now:

I changed the script to print the result:


import inspect, sys

/etc/hostname is one line, but our source has multiple lines

code = compile('\n\n\n1/0', '/etc/hostname', 'exec')

try: exec(code, {}) except Exception: tb = sys.exc_info()[2] else: assert False, "unreachable, exec should always raise exception"

this fails with an IndexError

print(inspect.getinnerframes(tb))


and I got this output:

C:\Users\User\src\cpython>python.bat x.py Running Release|Win32 interpreter... [FrameInfo(frame=<frame at 0x01140DF0, file 'C:\Users\User\src\cpython\x.py', line 14, code >, filename='C:\Users\User\src\cpython\x.py', lineno=7, function='', code_context=[' exec(code, {})\n'], index=0), FrameInfo(frame=<frame at 0x011CA758, file '/etc/hostname', line 4, code >, filename='/etc/hostname', lineno=4, function='', code_context=None, index=None)]