Gregory Nisbet Gregory Nisbet - 1 month ago 10
Python Question

Python determine whether an exception was thrown (regardless of whether it is caught or not)

I am writing tests for some legacy code that is littered with catch-all constructs like

try:
do_something()
do_something_else()

for x in some_huge_list():
do_more_things()

except Exception:
pass


and I want to tell whether an exception was thrown inside the try block.

I want to avoid introducing changes into the codebase just to support a few tests and I don't want to make the
except
cases more specific for fear of unintentionally introducing regressions.

Is there a way of extracting information about exceptions that were raised and subsequently handled from the runtime? Or some function with a similar API to
eval
/
exec
/
apply
/
call
that either records information on every raised exception, lets the user supply an exception handler that gets run first, or lets the user register a callback that gets run on events like an exception being raised or caught.

If there isn't a way to detect whether an exception was thrown without getting under the (C)Python runtime in a really nasty way, what are some good strategies for testing code with catch-all exceptions inside the units you're testing?

Answer

Your only realistic option is to instrument the except handlers.

Python does record exception information, which is retrievable with sys.exc_info(), but this information is cleared when a function exits (Python 2) or the try statement is done (Python 3).