Python 如何在 except 块里获取当前抛出的异常对象(不写 as e)
技术百科
舞夢輝影
发布时间:2026-01-25
浏览: 次 应使用 sys.exc_info()[1] 获取当前异常对象,它在 except 块内返回最近一次触发的异常实例,比手动 raise e 或访问帧对象更安全可靠,且能保留完整 traceback。
用 sys.exc_info() 获取当前异常三元组
当 except 块中没写 as e,Python 仍会把异常对象临时存放在解释器线程状态里。此时最直接的方式是调用 sys.exc_info() —— 它返回一个三元组 (type, value, traceback),其中 value 就是当前抛出的异常实例。
注意:这个函数只在 except 块内或其调用的函数中有效;一旦离开异常处理上下文(比如在 finally 或后续普通代码中),返回值可能为 (None, None, None)。
- 必须先
import sys - 推荐只取
sys.exc_info()[1],即异常对象本身;[0]是异常类,[2]是 traceback 对象(通常不需要手动处理) - 如果嵌套了多层
except,它始终返回**最近一次被触发的异常**,不是外层未处理的
raise 不带参数时也会复用当前异常对象
如果你只是想“重新抛出”当前异常(比如记录日志后继续向上冒泡),直接写 raise(不带任何参数)即可。此时 Python 会自动使用 sys.exc_info() 中保存的原始异常对象,包括它的类型、消息和完整 traceback。
- 这比手动
raise sys.exc_info()[1]更安全:能保留原始 traceback,不会丢失栈帧信息 - 手动
raise e(哪怕e = sys.exc_info()[1])会导致 traceback 从当前行开始重置,丢失原始出错位置 - 常见误用:
raise sys.exc_info()[0]—— 这会抛出类而非实例,触发TypeError: exceptions must derive from BaseException
为什么不用 inspect.currentframe().f_back.f_exc_*?
有人尝试通过帧对象访问 f_exc_value 等属性来获取异常,但这是不可靠的。这些属性仅在 CPython 3.12+ 中存在,且行为不稳定:它们只在进入 except 块**瞬间**被设置,稍后(如函数调用后)可能已被清空或覆盖。
-
sys.exc_info()
是官方支持、跨版本稳定的接口
-
f_exc_*属于内部实现细节,文档明确不保证兼容性 - 即便能读到,也不如
sys.exc_info()返回的三元组语义清晰、用途明确
实际场景:日志记录 + 异常分类判断
很多真实需求不是为了“拿对象”,而是做条件判断或结构化记录。例如区分网络错误和数据错误,或提取 HTTP 状态码。这时拿到 sys.exc_info()[1] 后可直接用 isinstance() 或访问其属性:
import systry: requests.get("https://www./link/086e34bf4e3aebbb142ead2fd4901c0a") except: exc = sys.exc_info()[1] if isinstance(exc, requests.exceptions.ConnectionError): logger.warning("Network unreachable: %s", exc) elif hasattr(exc, "response") and exc.response is not None: logger.error("HTTP %d: %s", exc.response.status_code, exc.response.reason) raise # 继续传播
这里的关键是:不依赖 as e,也能完成所有需要异常对象的操作;但要注意,如果后续代码有多个 except 嵌套,每次进入新的 except 都会刷新 sys.exc_info(),旧异常会被覆盖。
# ai
# 放在
# 这是
# 如果你
# 多个
# 也会
# 也能
# python
# 已被
# 不需要
# 只在
# http
# 对象
# 接口
# 为什么
# 线程
# 栈
# 抛出
# 状态码
# finally
# elif
# raise
相关栏目:
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
AI推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
SEO优化<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
技术百科<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
谷歌推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
百度推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
网络营销<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
案例网站<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
精选文章<?muma echo $count; ?>
】
相关推荐
- c++怎么处理多线程死锁_c++ lock_gua
- Windows如何拦截2345弹窗广告_Windo
- Win11怎么关闭触摸键盘图标_Windows11
- Win11怎么调整屏幕亮度_Windows 11调
- 如何使用正则表达式提取以编号开头、后接多个注解的逻
- Python正则表达式实战_模式匹配说明【教程】
- PHP主流架构如何做单元测试_工具与流程【详解】
- mac怎么看硬盘大小_MAC查看磁盘存储空间与文件
- c++如何用AFL++进行模糊测试 c++ Fuz
- Win11怎么解压RAR文件 Win11自带解压功
- php中::能用于接口静态方法吗_接口静态方法调用
- php本地部署后数据库连接报错_1045acces
- Windows怎样关闭锁屏广告_Windows关闭
- 如何在Golang中实现WebSocket广播_使
- 如何使用Golang实现路由分组管理_Golang
- 如何使用Golang操作指针变量_Golang解引
- Mac如何与安卓手机传文件_Mac和Android
- PythonPandas数据分析项目教程_时间序列
- Win11讲述人怎么关闭_Win11误触开启语音朗
- 如何在包含多值的列中精准搜索指定演员?
- Win11怎么设置桌面图标间距_Windows11
- Win10系统字体模糊怎么办_Windows10高
- 如何在 Python 中将 ISO 8601 时间
- 如何使用Golang开发基础文件下载功能_Gola
- Win11怎么设置麦克风权限_允许应用访问Win1
- Win10电脑怎么设置休眠快捷键_Windows1
- Win11键盘快捷键大全_Windows 11常用
- Win10如何更改用户账户控制_Windows10
- 如何使用Golang处理静态文件缓存_提高页面加载
- PHP主流架构如何处理会话管理_Session与C
- mac本地php环境如何开启curl_curl扩展
- Win11局域网共享怎么设置 Win11文件夹网络
- 如何使用 Python 合并文件夹内多个 Exce
- c# 如何用c#实现一个支持优先级的任务队列
- Python随机数生成_random模块说明【指导
- c++中如何使用虚函数实现多态_c++多态性实现原
- Win11开机Logo怎么换_Win11自定义启动
- Win11怎么关闭自动调节亮度 Win11禁用内容
- Win11怎么更改电脑密码_Windows 11修
- Windows 10自带杀毒软件在哪_Window
- VSC怎样在Linux运行PHP_Ubuntu系统
- 如何使用Golang table-driven基准
- Windows10系统更新错误0x80070002
- VSC怎样用终端运行PHP_命令行执行脚本的步骤【
- c++中的CRTP是什么 c++奇异递归模板模式【
- 如何使用正则表达式批量替换重复的星号-短横模式为固
- Win10怎么卸载鲁大师_Win10彻底卸载鲁大师
- Mac如何彻底清理浏览器缓存?(Safari与Ch
- Windows如何设置登录时的欢迎屏幕背景?(锁屏
- c++的static关键字有什么用 静态变量和静态


QQ客服