from contextlib import ExitStack, contextmanager @contextmanager def second(): try: yield 1 except Exception as exc: raise Exception("new exception") from exc @contextmanager def first(): try: yield 1 except Exception as exc: raise exc with ExitStack() as ctx: ctx.enter_context(second()) ctx.enter_context(first()) raise RuntimeError("bad")