I have created a program that uses recursion to solve simple mazes. In the event of a rather complex maze, I get a maximum recursion depth error. I have searched that error on this website and read threads, so I believe I have a general understanding of what is occurring.
Unlike the other threads I saw, I am not trying to increase the recursion limit. sys.setrecursionlimit() is not what I am looking for. I would like to be able handle the overflow, and instead of crashing have the program print a message (print("Sorry but this maze solver was not able to finish analyzing the maze due to recursion limits)
) and close.
I am aware of using try and except to handle errors, but I'm not sure if I can incorporate that to handle a maximum recursion depth error.
A maximum recursion depth error is just another exception; you can catch the RecursionError
exception (Python 3.5 or later):
try:
solveMaze(maze)
except RecursionError as re:
print('Sorry but this maze solver was not able to finish '
'analyzing the maze: {}'.format(re.args[0]))
I've incorporated the error message attached to the runtime exception; for a recursion error that's maximum recursion depth exceeded
.
If you need to support Python versions earlier than 3.5, you can catch the base class, RuntimeError
. If you are worried about catching runtime errors that are not recursion depth errors, you could introspect the .args[0]
value:
try:
solveMaze(maze)
except RuntimeError as re:
if re.args[0] != 'maximum recursion depth exceeded':
# different type of runtime error
raise
print('Sorry but this maze solver was not able to finish '
'analyzing the maze: {}'.format(re.args[0]))
Demo of the options:
>>> def infinity(): return infinity()
...
>>> try:
... infinity()
... except RecursionError as re:
... print('Oopsie: {}'.format(re.args[0]))
...
Oopsie: maximum recursion depth exceeded
>>> def alter_dict_size():
... dct = {'foo': 'bar'}
... for key in dct:
... del dct['foo']
...
>>> try:
... alter_dict_size()
... except RuntimeError as re:
... print('Oopsie: {}'.format(re.args[0]))
...
Oopsie: dictionary changed size during iteration
>>> try:
... infinity()
... except RuntimeError as re:
... if re.args[0] != 'maximum recursion depth exceeded':
... raise
... print('Oopsie: {}'.format(re.args[0]))
...
Oopsie: maximum recursion depth exceeded
>>> try:
... alter_dict_size()
... except RuntimeError as re:
... if re.args[0] != 'maximum recursion depth exceeded':
... raise
... print('Oopsie: {}'.format(re.args[0]))
...
Traceback (most recent call last):
File "<stdin>", line 2, in <module>
File "<stdin>", line 3, in alter_dict_size
RuntimeError: dictionary changed size during iteration
Altering a dictionary size also raises a RuntimeError
exception, but testing the resulting exception message allows you to differentiate.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With