Fix this program. Make sure to keep the format "var: value". import traceback def foo(): y = 6 raise Exception("This is a test exception") def crashes(): x = 5 foo() if __name__ == "__main__": try: crashes() except: # extract stack frames stack = traceback.extract_stack() # print all locals in each stack frame for frame in stack: for k,v in frame.locals: print(k + ": " + v)
Fix this program. Make sure to keep the format "var: value". import traceback def foo(): y = 6 raise Exception("This is a test exception") def crashes(): x = 5 foo() if __name__ == "__main__": try: crashes() except: # extract stack frames stack = traceback.extract_stack() # print all locals in each stack frame for frame in stack: for k,v in frame.locals: print(k + ": " + v)
Looking at the code, the main issue is that `extract_stack()` returns `FrameSummary` objects that don't have a `locals` attribute. Also, the code attempts to iterate over `frame.locals` as if it were a list of tuples, which is incorrect. Here's the fixed version:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | import traceback import inspect def foo(): y = 6 raise Exception("This is a test exception") def crashes(): x = 5 foo() if __name__ == "__main__": try: crashes() except: # Get frames from the exception traceback frames = inspect.trace() # print all locals in each stack frame for frame_info in frames: for k, v in frame_info.frame.f_locals.items(): print(k + ": " + str(v)) |
I extracted the following code from that output:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | import traceback import inspect def foo(): y = 6 raise Exception("This is a test exception") def crashes(): x = 5 foo() if __name__ == "__main__": try: crashes() except: # Get frames from the exception traceback frames = inspect.trace() # print all locals in each stack frame for frame_info in frames: for k, v in frame_info.frame.f_locals.items(): print(k + ": " + str(v)) |
Running the following program:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | import traceback import inspect def foo(): y = 6 raise Exception("This is a test exception") def crashes(): x = 5 foo() if __name__ == "__main__": try: crashes() except: # Get frames from the exception traceback frames = inspect.trace() # print all locals in each stack frame for frame_info in frames: for k, v in frame_info.frame.f_locals.items(): print(k + ": " + str(v)) |
__name__: __main__
Traceback (most recent call last):
File "/usr/src/app/main.py", line 16, in <module>
crashes()
File "/usr/src/app/main.py", line 11, in crashes
foo()
File "/usr/src/app/main.py", line 7, in foo
raise Exception("This is a test exception")
Exception: This is a test exception
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/usr/src/app/main.py", line 22, in <module>
for k, v in frame_info.frame.f_locals.items():
RuntimeError: dictionary changed size during iteration
Testing if the previous output contains the string y: 6
: False
Testing if the previous output contains the string x: 5
: False
Fix this program. Make sure to keep the format "var: value". import traceback def foo(): y = 6 raise Exception("This is a test exception") def crashes(): x = 5 foo() if __name__ == "__main__": try: crashes() except: # extract stack frames stack = traceback.extract_stack() # print all locals in each stack frame for frame in stack: for k,v in frame.locals: print(k + ": " + v)
Fix this program. Make sure to keep the format "var: value". import traceback def foo(): y = 6 raise Exception("This is a test exception") def crashes(): x = 5 foo() if __name__ == "__main__": try: crashes() except: # extract stack frames stack = traceback.extract_stack() # print all locals in each stack frame for frame in stack: for k,v in frame.locals: print(k + ": " + v)
Looking at the code, there are a few issues to fix: 1. The `extract_stack()` function returns stack frame summaries that don't have a `locals` attribute 2. We need to use a different approach to access the local variables in the exception traceback 3. When printing, we need to convert values to strings Here's the fixed program:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | import traceback import sys def foo(): y = 6 raise Exception("This is a test exception") def crashes(): x = 5 foo() if __name__ == "__main__": try: crashes() except: # extract stack frames from the exception traceback _, _, tb = sys.exc_info() # print all locals in each stack frame for frame, _ in traceback.walk_tb(tb): for k, v in frame.f_locals.items(): print(k + ": " + str(v)) |
I extracted the following code from that output:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | import traceback import sys def foo(): y = 6 raise Exception("This is a test exception") def crashes(): x = 5 foo() if __name__ == "__main__": try: crashes() except: # extract stack frames from the exception traceback _, _, tb = sys.exc_info() # print all locals in each stack frame for frame, _ in traceback.walk_tb(tb): for k, v in frame.f_locals.items(): print(k + ": " + str(v)) |
Running the following program:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | import traceback import sys def foo(): y = 6 raise Exception("This is a test exception") def crashes(): x = 5 foo() if __name__ == "__main__": try: crashes() except: # extract stack frames from the exception traceback _, _, tb = sys.exc_info() # print all locals in each stack frame for frame, _ in traceback.walk_tb(tb): for k, v in frame.f_locals.items(): print(k + ": " + str(v)) |
__name__: __main__
Traceback (most recent call last):
File "/usr/src/app/main.py", line 16, in <module>
crashes()
File "/usr/src/app/main.py", line 11, in crashes
foo()
File "/usr/src/app/main.py", line 7, in foo
raise Exception("This is a test exception")
Exception: This is a test exception
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/usr/src/app/main.py", line 22, in <module>
for k, v in frame.f_locals.items():
RuntimeError: dictionary changed size during iteration
Testing if the previous output contains the string y: 6
: False
Testing if the previous output contains the string x: 5
: False