Today I learned that if you suppress the exception KeyboardInterrupt then your program is still interrupted but it doesn't display a traceback.

Interrupting scripts without tracebacks

The module contextlib provides a context manager called suppress that you can use to suppress an exception of the given type for the code within its body. Writing

from contextlib import suppress

with suppress(SomeException):
    ...

is more or less the same as writing

try:
    ...
except SomeException:
    pass

If an exception is raised inside SomeException, the body of the with statement stops executing and the code continues after the context manager.

Thus, if we use suppress in conjunction with a function โ€œmainโ€ย from a script, we can provide a way for the user to interrupt the script with Ctrl + C and without polluting the terminal with a traceback.

Here is an example of a silly script:

import time

def main():
    print("Doing work...")
    time.sleep(60)  # Not really, just sleeping!
    print("Done!")

if __name__ == "__main__":
    main()

If you run this and hit Ctrl + C, your terminal will display this:

^CTraceback (most recent call last):
  File "<string>", line 9, in <module>
    main()
    ~~~~^^
  File "<string>", line 5, in main
    time.sleep(60)  # Not really, just sleeping!
    ~~~~~~~~~~^^^^
KeyboardInterrupt

If you don't want the traceback, for example if you're sharing your script with non-technical folks, you can use suppress around the call to the function main:

from contextlib import suppress
import time

def main():
    print("Doing work...")
    time.sleep(60)  # Not really, just sleeping!
    print("Done!")

if __name__ == "__main__":
    with suppress(KeyboardInterrupt):
        main()

If you interrupt your modified script, you only get this:

^C%

This is much cleaner!

Become a better Python ๐Ÿ developer, drop by drop ๐Ÿ’ง

Get a daily drop of Python knowledge. A short, effective tip to start writing better Python code: more idiomatic, more effective, more efficient, with fewer bugs. Subscribe here.

References

Previous Post Next Post

Blog Comments powered by Disqus.