
python 3.12+ 提供了 `sys.exception()` 函数,可在 `except` 块作用域外直接访问最近一次捕获的异常对象,无需显式传递参数或依赖全局变量。
在传统异常处理中,若需在 except 块之外(如独立函数)使用异常对象,开发者常被迫将异常作为参数传入,或借助 sys.exc_info() 配合上下文管理——但后者易受嵌套异常干扰,且 exc_info() 返回的是元组(type, value, traceback),使用不够直观。
自 Python 3.12 起,sys.exception() 成为更简洁、安全的替代方案:它仅在 except 或 finally 子句的执行期间有效,返回当前正在处理的异常实例(即 except Exception as e 中的 e),类型为具体的异常类(如 KeyError、ValueError),而非元组。
✅ 正确用法示例:
import sys
def other_function():
exc = sys.exception()
if exc is None:
raise RuntimeError("No active exception context")
print(f"Caught {type(exc).__name__}: {exc}")
# 可进一步记录日志、做类型判断或重新抛出
if isinstance(exc, KeyError):
print("→ This was a missing key error.")
try:
raise KeyError("user_not_found")
except Exception:
other_function() # ✅ 安全调用,处于 except 上下文中⚠️ 注意事项:
- sys.exception() 仅在 except 或 finally 块内及其直接调用的函数中有效;一旦控制流离开异常处理结构(例如 except 块结束),该函数返回 None;
- 不适用于 except*(PEP 654 的异常组)场景,其行为未定义;
- 在多线程环境中,每个线程维护独立的异常上下文,因此 sys.exception() 是线程安全的;
- 若需兼容 Python
? 总结:sys.exception() 是 Python 异常处理演进中的重要简化工具,它提升了代码解耦性与可读性。推荐在支持的版本中优先使用,避免手动传递异常参数,同时始终检查返回值是否为 None 以增强健壮性。










