from contextlib import contextmanager import typing @contextmanager def exceptionNote(note: str | typing.Callable[[], str]) -> typing.Iterator[None]: """Add a note if an exception propagates from a 'with'-block. The ``note`` argument may be a string or a zero-arg callable (`lambda: f"note {x}"`). Using a lambda argument may be desirable if the note is the result of e.g., a formatting operation, which is deferred until an exception actually occurs.""" try: yield except Exception as e: if not isinstance(note, str): note = note() e.add_note(note) raise if __name__ == "__main__": with exceptionNote("while demonstrating exceptionNote"): 3 / 0