10/31/2020
Can you write a Python program that will fail? I write code that fails nearly everytime I set out to write some kind of program. I would guess that there might be more ways to write a program that fails than there are to write a program that is successful. Most of the time the code I write will fail inadvertently, but recently I needed to write some simple code to test out my logic for fixing a production issue. It turns out to be pretty simple to write a program that fails in Python. For example, save the following code in a file named do_nothing.py
and try running it.
import nothing
Assuming that you don't have any modules named "nothing", then you probably see some output like
Traceback (most recent call last):
File ".\do_nothing.py", line 1, in <module>
import nothing
ModuleNotFoundError: No module named 'nothing'
Now, suppose you have a function that processes some data in a loop, and then once the loop completes will output the final result of the data processing. Such a function might look like
def process():
value = 0
for i in range(10):
value += 1
print("The final value is {}".format(value))
process()
The result of running that program should be
The final value is 10
But what if that loop fails for some reason? How can we make it fail? Well, one way would be to import nothing
inside of the loop.
def process():
value = 0
for i in range(10):
value += 1
import nothing
print("The final value is {}".format(value))
process()
Now running this program should give us this output:
Traceback (most recent call last):
File ".\do_nothing.py", line 8, in <module>
process()
File ".\do_nothing.py", line 5, in process
import nothing
ModuleNotFoundError: No module named 'nothing'
Hmm, well processing that value
and getting it's final result is really important to us. Really, importing nothing is not so important, but we still want to give it a shot just in case it might succeed sometime. Let's utilize some exception handling to make this work better.
def process():
value = 0
for i in range(10):
value += 1
try:
import nothing
except Exception as e:
continue
print("The final value is {}".format(value))
process()
Now running that we get the output:
The final value is 10
Hooray! We got our important data by including a try/except block with a "continue" on an exception.
Knowing how to make Python "fail" like this and quickly implement your test logic is a great skill to have. It could make a difference in avoiding a failed loop that should be updating your database rather than sending thousands of *** URGENT *** emails to your boss during the night.
Happy hacking!