5. 异常处理在测试脚本中怎么用
异常处理是 Python 测试脚本稳定性的重要保障。很多自动化脚本不是因为系统 Bug 失败,而是因为文件路径错误、接口超时、字段不存在、JSON 解析失败、数据库连接失败等异常直接中断。测试工程师如果不会合理处理异常,脚本就会变得脆弱;如果滥用异常,把所有错误都吞掉,又会掩盖真实问题。
面试中问异常处理,不要只背 try except finally。更好的回答是:异常处理用于捕获脚本执行中的可预期错误,记录日志、保留现场、给出清晰失败原因,但不能随便忽略错误。测试自动化中,异常处理应该帮助定位问题,而不是隐藏问题。
一、什么是异常
异常是程序运行过程中出现的错误。例如:
- 文件不存在;
- 除以零;
- 字典 key 不存在;
- JSON 格式错误;
- 接口请求超时;
- 数据库连接失败;
- 类型转换失败。
如果不处理,程序会中断。
二、基本语法
try:
result = 10 / 0
except ZeroDivisionError as e:
print(f"计算异常: {e}")
常见结构:
try:
# 可能出错的代码
pass
except Exception as e:
# 异常处理
print(e)
else:
# 没有异常时执行
pass
finally:
# 无论是否异常都执行
pass
finally 常用于关闭文件、关闭数据库连接、清理资源。
三、接口请求中的异常处理
接口自动化最常见的是请求异常。
import requests
try:
response = requests.get("https://api.example.com", timeout=5)
except requests.exceptions.Timeout:
print("接口请求超时")
except requests.exceptions.RequestException as e:
print(f"请求异常: {e}")
测试场景:
- 服务不可用;
- 网络超时;
- DNS 解析失败;
- 连接被拒绝;
- HTTPS 证书问题。
捕获后要记录 URL、请求参数、异常信息,方便定位。
四、JSON 解析异常
接口返回不是合法 JSON 时,解析会失败。
try:
data = response.json()
except ValueError as e:
print(f"响应不是合法 JSON: {e}")
测试中如果接口预期返回 JSON,但实际返回 HTML 错误页,就可能触发这个异常。
五、字段不存在异常
接口响应字段缺失时,直接取值会报 KeyError。
try:
code = data["code"]
except KeyError:
print("响应缺少 code 字段")
更推荐先断言字段存在:
assert "code" in data
测试脚本要能明确告诉你缺哪个字段。
六、文件读写异常
读取测试数据时常见:
try:
with open("case.json", "r", encoding="utf-8") as f:
content = f.read()
except FileNotFoundError:
print("测试数据文件不存在")
自动化框架中,文件路径错误是常见失败原因。
七、数据库异常
数据库连接、SQL 执行可能失败。
常见原因:
- 数据库地址错误;
- 用户名密码错误;
- SQL 语法错误;
- 表不存在;
- 查询超时。
异常处理要记录 SQL、数据库环境和错误信息,但不要把数据库错误吞掉后继续断言。
八、异常处理和断言的区别
异常处理不是替代断言。
断言用于判断实际结果是否符合预期。
异常处理用于处理脚本运行过程中的错误。
例如接口返回业务 code 不对,应该用断言失败;接口请求超时,是请求异常。
九、不要滥用 except Exception
很多人写:
try:
run_case()
except Exception:
pass
这是非常危险的。它会吞掉所有错误,导致用例看起来通过但实际没有验证。
如果使用通用异常,也要记录日志并让用例失败。
十、异常处理在框架中的作用
自动化框架中,异常处理常用于:
- 记录失败日志;
- 截图;
- 保存请求响应;
- 清理测试数据;
- 关闭连接;
- 生成报告失败原因;
- 保证一个用例失败不影响全部用例执行。
例如 UI 自动化失败时截图,接口自动化失败时记录请求和响应。
十一、面试回答模板
如果面试官问“异常处理在测试脚本中怎么用”,可以这样回答:
异常处理主要用于提高测试脚本稳定性和可定位性。接口自动化中常见异常有请求超时、连接失败、响应不是 JSON、字段缺失、文件不存在、数据库连接失败等。我会用 try except 捕获可预期异常,记录 URL、请求参数、响应内容和异常信息,必要时截图或写日志;但不会随便把异常吞掉,因为异常可能代表真实问题。断言失败和脚本异常也要区分,业务结果不符合预期用断言,脚本执行错误用异常处理。
十二、常见追问
追问:finally 有什么用?
无论是否发生异常都会执行,常用于关闭文件、数据库连接、清理资源。
追问:为什么不能直接 except Exception pass?
会吞掉真实错误,导致用例假通过,降低自动化可信度。
追问:接口返回非 JSON 怎么处理?
捕获 JSON 解析异常,记录状态码、响应文本和请求信息,再让用例失败。
十三、练习清单
- 捕获请求超时;
- 捕获文件不存在;
- 捕获 JSON 解析失败;
- 捕获 KeyError;
- 使用 finally 关闭资源;
- 区分异常和断言失败;
- 记录异常日志;
- 不吞掉异常;
- 在框架中保存失败现场;
- 准备异常处理面试回答。
异常处理的目标不是让脚本“不报错”,而是让错误更清楚、更可定位、更不影响整体执行。
配套刷题:

