求VS Code调试器中未捕获异常与用户未捕获异常的Python代码示例
VS Code Python调试器:「未捕获异常」与「用户未捕获异常」的差异
核心定义
- 未捕获异常:覆盖所有未被
try/except捕获的异常——不管异常是你自己写的代码抛出的,还是标准库、第三方库内部抛出的,调试器都会在异常抛出位置中断。 - 用户未捕获异常:仅针对你自己编写的代码中抛出且未被捕获的异常。如果异常是标准库/第三方库内部抛出的,哪怕你没在代码里处理,调试器也不会中断。
注意:要让这个差异生效,确保VS Code调试配置(
launch.json)中的justMyCode设置为true(默认值就是true,若被修改过需改回)。
可复现差异的代码示例
示例1:用户代码抛出未捕获异常
def user_defined_func(): # 这是用户自己写的代码抛出异常 raise ValueError("用户代码触发的未捕获异常") user_defined_func()
- 勾选「未捕获异常」:调试器会在
raise语句处中断。 - 勾选「用户未捕获异常」:调试器同样会在
raise语句处中断(符合“用户代码抛出的未捕获异常”条件)。
示例2:标准库内部抛出未捕获异常
import json # 调用标准库json的loads函数,传入无效格式的字符串,触发库内部的异常 json.loads("{invalid-json}")
- 勾选「未捕获异常」:调试器会在
json模块内部抛出异常的位置中断(即使justMyCode为true,也会显示“外部代码”的中断提示)。 - 勾选「用户未捕获异常」:调试器不会中断,程序直接因异常崩溃(因为异常是标准库内部抛出的,不属于用户代码的未捕获异常范畴)。
为什么你之前的测试没看到差异?
如果你用math.sqrt(-1)这类例子没看到差异,大概率是因为:
当你调用math.sqrt(-1)时,异常虽然是math库抛出的,但调试器的justMyCode若设为false,会加载库代码的栈帧,此时「用户未捕获异常」的判定会包含调用链路中的用户代码帧,导致调试器中断。只要把justMyCode设为true,就能看到上述示例中的差异。
内容的提问来源于stack exchange,提问作者mg-arm
相关产品推荐
相关产品推荐

