Issue 44917: interpreter hangs on recursion in both body and handler of a try block
This was found while investigating issue44895. It may or may not be the cause of that issue. The script below hangs on a mac (it's an extract from test_exceptions.test_recursion_in_except_handler). ----------- import sys count = 0 def main(): def f(): global count count += 1 try: f() except RecursionError: f() sys.setrecursionlimit(30) try: f() except RecursionError: pass main() print(count) ----------- When I kill it the traceback shows it alternating between the two recursive calls, but not in a regular pattern: ... [snipped a lot] File "/Users/iritkatriel/src/cpython/tt.py", line 13, in f f() ^^^ File "/Users/iritkatriel/src/cpython/tt.py", line 13, in f f() ^^^ [Previous line repeated 2 more times] RecursionError: maximum recursion depth exceeded During handling of the above exception, another exception occurred: Traceback (most recent call last): File "/Users/iritkatriel/src/cpython/tt.py", line 11, in f f() ^^^ RecursionError: maximum recursion depth exceeded During handling of the above exception, another exception occurred: Traceback (most recent call last): File "/Users/iritkatriel/src/cpython/tt.py", line 11, in f f() ^^^ File "/Users/iritkatriel/src/cpython/tt.py", line 13, in f f() ^^^ RecursionError: maximum recursion depth exceeded During handling of the above exception, another exception occurred: Traceback (most recent call last): File "/Users/iritkatriel/src/cpython/tt.py", line 11, in f f() ^^^ RecursionError: maximum recursion depth exceeded During handling of the above exception, another exception occurred: Traceback (most recent call last): File "/Users/iritkatriel/src/cpython/tt.py", line 11, in f f() ^^^ File "/Users/iritkatriel/src/cpython/tt.py", line 13, in f f() ^^^ File "/Users/iritkatriel/src/cpython/tt.py", line 13, in f f() ^^^ RecursionError: maximum recursion depth exceeded During handling of the above exception, another exception occurred: Traceback (most recent call last): File "/Users/iritkatriel/src/cpython/tt.py", line 11, in f f() ^^^ RecursionError: maximum recursion depth exceeded During handling of the above exception, another exception occurred: Traceback (most recent call last): File "/Users/iritkatriel/src/cpython/tt.py", line 11, in f f() ^^^ File "/Users/iritkatriel/src/cpython/tt.py", line 13, in f f() ^^^ RecursionError: maximum recursion depth exceeded During handling of the above exception, another exception occurred: Traceback (most recent call last): File "/Users/iritkatriel/src/cpython/tt.py", line 11, in f f() ^^^ RecursionError: maximum recursion depth exceeded During handling of the above exception, another exception occurred: Traceback (most recent call last): File "/Users/iritkatriel/src/cpython/tt.py", line 11, in f f() ^^^ File "/Users/iritkatriel/src/cpython/tt.py", line 13, in f f() ^^^ File "/Users/iritkatriel/src/cpython/tt.py", line 13, in f f() ^^^ File "/Users/iritkatriel/src/cpython/tt.py", line 13, in f f() ^^^ RecursionError: maximum recursion depth exceeded During handling of the above exception, another exception occurred: Traceback (most recent call last): File "/Users/iritkatriel/src/cpython/tt.py", line 11, in f f() ^^^ RecursionError: maximum recursion depth exceeded During handling of the above exception, another exception occurred: Traceback (most recent call last): File "/Users/iritkatriel/src/cpython/tt.py", line 11, in f f() ^^^ File "/Users/iritkatriel/src/cpython/tt.py", line 13, in f f() ^^^ RecursionError: maximum recursion depth exceeded During handling of the above exception, another exception occurred: Traceback (most recent call last): File "/Users/iritkatriel/src/cpython/tt.py", line 11, in f f() ^^^ RecursionError: maximum recursion depth exceeded During handling of the above exception, another exception occurred: Traceback (most recent call last): File "/Users/iritkatriel/src/cpython/tt.py", line 11, in f f() ^^^ File "/Users/iritkatriel/src/cpython/tt.py", line 13, in f f() ^^^ File "/Users/iritkatriel/src/cpython/tt.py", line 13, in f f() ^^^ RecursionError: maximum recursion depth exceeded During handling of the above exception, another exception occurred: Traceback (most recent call last): File "/Users/iritkatriel/src/cpython/tt.py", line 11, in f f() ^^^ RecursionError: maximum recursion depth exceeded During handling of the above exception, another exception occurred: Traceback (most recent call last): File "/Users/iritkatriel/src/cpython/tt.py", line 11, in f f() ^^^ File "/Users/iritkatriel/src/cpython/tt.py", line 13, in f f() ^^^ RecursionError: maximum recursion depth exceeded During handling of the above exception, another exception occurred: Traceback (most recent call last): File "/Users/iritkatriel/src/cpython/tt.py", line 11, in f f() ^^^ RecursionError: maximum recursion depth exceeded During handling of the above exception, another exception occurred: Traceback (most recent call last): File "/Users/iritkatriel/src/cpython/tt.py", line 11, in f f() ^^^ File "/Users/iritkatriel/src/cpython/tt.py", line 13, in f f() ^^^ File "/Users/iritkatriel/src/cpython/tt.py", line 13, in f f() ^^^ File "/Users/iritkatriel/src/cpython/tt.py", line 13, in f f() ^^^ [Previous line repeated 1 more time] RecursionError: maximum recursion depth exceeded During handling of the above exception, another exception occurred: Traceback (most recent call last): File "/Users/iritkatriel/src/cpython/tt.py", line 22, in <module> main() ^^^^^^ File "/Users/iritkatriel/src/cpython/tt.py", line 18, in main f() ^^^ File "/Users/iritkatriel/src/cpython/tt.py", line 11, in f f() ^^^ File "/Users/iritkatriel/src/cpython/tt.py", line 11, in f f() ^^^ File "/Users/iritkatriel/src/cpython/tt.py", line 11, in f f() ^^^ [Previous line repeated 10 more times] File "/Users/iritkatriel/src/cpython/tt.py", line 13, in f f() ^^^ File "/Users/iritkatriel/src/cpython/tt.py", line 11, in f f() ^^^ File "/Users/iritkatriel/src/cpython/tt.py", line 13, in f f() ^^^ File "/Users/iritkatriel/src/cpython/tt.py", line 11, in f f() ^^^ File "/Users/iritkatriel/src/cpython/tt.py", line 11, in f f() ^^^ File "/Users/iritkatriel/src/cpython/tt.py", line 11, in f f() ^^^ File "/Users/iritkatriel/src/cpython/tt.py", line 13, in f f() ^^^ File "/Users/iritkatriel/src/cpython/tt.py", line 11, in f f() ^^^ File "/Users/iritkatriel/src/cpython/tt.py", line 13, in f f() ^^^ File "/Users/iritkatriel/src/cpython/tt.py", line 13, in f f() ^^^ File "/Users/iritkatriel/src/cpython/tt.py", line 13, in f f() ^^^ File "/Users/iritkatriel/src/cpython/tt.py", line 7, in f def f(): KeyboardInterrupt