如何在PyCharm中调试try except块内被捕获的异常?
PyCharm调试被try/except捕获的异常的可行方案
完全不需要手动注释try/except代码块,PyCharm本身就原生支持对被捕获的异常触发断点,按下面的配置操作就行:
方法1:配置异常断点触发规则
- 调出断点配置面板:调试状态下点击调试工具栏里的双红点
View Breakpoints按钮,或者直接按快捷键Ctrl+Shift+F8(Windows/Linux)/Cmd+Shift+F8(Mac) - 左侧列表选择需要拦截的异常类型:要拦截所有异常就选
Any Exception,只需要拦截特定类型异常(比如ValueError、KeyError)就直接搜索对应异常类名添加 - 右侧配置触发条件:在
On raise设置区,默认只勾选了*On uncaught exception(仅未捕获的异常触发断点),你把同区域的On caught exception*(被捕获的异常)勾选上 - 保存配置后重启调试,哪怕异常被后续的except块捕获处理,程序也会在异常实际抛出的代码行直接暂停,你可以正常查看当前作用域的所有变量、调用栈信息,和普通断点的调试体验没有区别
方法2:临时调试的轻量方案
如果只是临时排查单次问题,不想改全局断点配置被第三方库、框架内部的自处理异常干扰,可以用这个方法:
- 直接在对应的except代码块第一行打一个普通行断点
- 调试触发异常后,程序会停在except块内,这时候点击调试工具栏的
Drop Frame(回退栈帧)按钮,就能直接跳回异常抛出前的执行位置,往前追溯try块内的执行逻辑
小提示:如果开了全局的被捕获异常断点,大概率会先卡在标准库、第三方依赖内部自己抛了又接住的异常位置,直接按
F9(Resume Program,继续运行)跳过即可,不想反复跳的话可以在断点配置的Condition栏加过滤条件,比如限定仅当前项目模块触发:__name__ == '你要调试的模块名',就能过滤掉无关的异常断点。
内容的提问来源于stack exchange,提问作者algebruh
相关产品推荐
相关产品推荐

