Python自动化测试基础:异常处理机制详解与实战

叶初
叶初
发布时间:2026-10-15| 5人浏览过
原创

本文深入解析Python中的异常处理机制,涵盖异常捕获原理、特定异常与万能捕获的区别、finally块的作用及异常信息打印。通过注册系统实例,演示ValueError、TypeError等常见错误的处理方案,帮助自动化测试人员掌握稳健的代码维护技巧。

一、前言

本文继续深入Python基础内容,重点讲解异常的识别、捕获与处理机制。掌握这些知识是构建稳定自动化测试框架及进行日常维护的前提。接下来直接进入核心主题。

二、异常处理合集

2.1 异常处理讲解

在探讨具体技术前,需明确一个核心观点:编程世界不存在绝对完美的代码。由于人为因素的局限性,任何程序都可能存在未覆盖的场景。因此,在真实项目环境中,应警惕“代码无bug”或“绝对可靠”这类断言,因为编程本质上是充满不确定性的。

既然程序由人编写,必然存在缺陷。当程序偏离预期流程运行时,即产生“异常”。异常处理的目的正是解决这类非正常情况,确保程序能按照既定逻辑和流程继续执行。

2.2 异常捕获

当程序执行出错时,默认会终止运行。通过异常处理机制,我们可以捕获这些错误,使程序得以继续运行或优雅退出,这个过程称为“异常捕获”。首先观察一个基础示例:

print("------------------- 欢迎来到报名注册系统 -------------------")
 
age = (input("请输入您的年龄:"))
age = int(age)
if age < 18:
    print("很遗憾,您暂时不满足注册条件")
else:
    print("恭喜您符合注册条件")

如所示,当输入数据为18时,程序逻辑计算正常,代码顺利执行至结束。但这是否意味着代码没有问题?让我们进一步测试,当输入为英文字母“abc”时,程序抛出ValueError错误。该错误提示表明发生了数值转换异常,即无法将字符串转换为整型:

print("------------------- 欢迎来到报名注册系统 -------------------")
 
age = (input("请输入您的年龄:"))
age = int(age)
if age < 18:
    print("很遗憾,您暂时不满足注册条件")
else:
    print("恭喜您符合注册条件")

如所示,当出现ValueError报错时,我们可以通过异常捕获机制进行处理。处理后的代码如下:

print("------------------- 欢迎来到报名注册系统 -------------------")
age = (input("请输入您的年龄:"))
 
try:
    age = int(age)
except:
    print("您的年龄输入非法,请重新运行本程序")
 
if age < 18:
    print("很遗憾,您暂时不满足注册条件")
else:
    print("恭喜您符合注册条件")

如所示,再次执行该程序并输入“abc”,程序依然无法正常运行。此时报错已变为TypeError类型错误。

2.3 异常捕获原理

要解决上述TypeError报错,需先理解异常捕获的工作原理。当执行try语句时,Python会在当前程序上下文中设置一个标记点。若发生异常,程序会返回至该标记点。try子句优先执行,随后可能面临以下几种场景:

场景一:若执行try语句时发生异常,Python会跳转回try块并执行第一个与该异常匹配的except子句。异常处理完成后,代码继续向下执行。

场景二:若执行try语句时发生异常,且没有匹配的except子句,异常将向上传递至更外层的try块或程序顶层,随后程序终止并打印错误信息。

场景三:若try子句执行期间未发生异常,Python将忽略except块,继续执行后续代码语句。

理解原理后,我们回顾之前的TypeError报错。表面看是整型与字符串比较的类型错误,但根本原因在于:在try块中,变量age的类型转换因捕获到异常而中断。由于try块内的age转换失败(抛出ValueError),程序跳转至except子句执行,导致age变量未被正确赋值或类型未转换。后续代码尝试比较age时,因age仍为字符串类型,从而引发TypeError。解决此问题的关键在于将判断逻辑也放入try块中。

当判断语句置于try块内时,逻辑发生变化:若未捕获异常,程序正常执行判断;若捕获到异常,则直接跳转至except块输出提示信息(如“年龄非法”),不再执行后续判断逻辑,从而避免了TypeError。这种因代码结构调整导致的连带错误,常被戏称为开发中的“买一送一”Bug。修改后的代码如下:

# 程序仍然有可优化的地方,仅展示try.. except语句的使用方式
print("------------------- 欢迎来到报名注册系统 -------------------")
age = (input("请输入您的年龄:"))
 
try:
    age = int(age)
    if age < 18:
        print("很遗憾,您暂时不满足注册条件")
    else:
        print("恭喜您符合注册条件")
except:
    print("您的年龄输入非法,请重新运行本程序")

2.4 特定异常捕获

特定异常捕获指针对某一具体类型的异常进行精准捕获。例如前文遇到的ValueError。如果捕获的是其他异常类型(如IndexError),当代码实际抛出ValueError时,程序仍会报错:

print("------------------- 欢迎来到报名注册系统 -------------------")
age = (input("请输入您的年龄:"))
 
try:
    age = int(age)
    if age < 18:
        print("很遗憾,您暂时不满足注册条件")
    else:
        print("恭喜您符合注册条件")
# 这里进行捕获的异常类型是IndexError,非ValueError,最后的结果仍然会报错,因为没有成功捕获
except IndexError:
    print("您的年龄输入非法,请重新运行本程序")

如所示,当捕获类型不匹配时,程序仍会弹出报错并终止。这好比处理酒驾应由交警负责,而非民政局,异常捕获也讲究“对口”。如下代码所示,若设置为捕获ValueError,则能成功处理该异常,如同交警正确处理了酒驾案件:

print("------------------- 欢迎来到报名注册系统 -------------------")
age = (input("请输入您的年龄:"))
 
try:
    age = int(age)
    if age < 18:
        print("很遗憾,您暂时不满足注册条件")
    else:
        print("恭喜您符合注册条件")
except ValueError:
    print("您的年龄输入非法,请重新运行本程序")

2.5 异常捕获的处理

前例中,当异常捕获指定为IndexError时,运行程序仍会出现ValueError错误。然而,若不使用特定类型,直接仅使用except时却能捕获所有异常。这引发了一个疑问:既然except能捕获所有,为何还要设置特定异常?

可以将except视为“万能警察”,它能捕获绝大多数异常类型(极少数系统级异常除外)。而特定异常捕获则像“专科医生”,专门处理特定类型的错误。例如,皮肤问题挂皮肤科比急诊科更专业,术业有专攻。

由于except是万能捕获,其处理逻辑对所有异常通常一致。若感冒和心脏病发作采用相同的处理方式显然不合理。此时,特定的“专科医生”(特定捕获)就能提供针对性的处理方案。

常见报错包括ValueError、TypeError、IndexError等。在自动化测试中,难免遇到其他未知报错。若不清楚具体类型,可通过两种方式处理:一是“踩坑”法,即遇到一次后记录并提前捕获;二是在末尾保留except作为兜底。如下代码所示,当特定捕获未命中但程序仍出错时,最后的except将作为兜底捕获:

print("------------------- 欢迎来到报名注册系统 -------------------")
age = (input("请输入您的年龄:"))
 
try:
    age = int(age)
    if age < 18:
        print("很遗憾,您暂时不满足注册条件")
    else:
        print("恭喜您符合注册条件")
# 这里会报错ValueError,因为捕获的类型是IndexError,很明显无法进行ValueError异常捕获,那么我们可以在添加一个万能捕手except来进行捕获
except IndexError:
    print("您的年龄输入非法,请重新运行本程序")
# 在下面可以在进行一个except的添加:
except:
    print("万能捕手在此,束手就擒吧!")

2.6 except、Exception与BaseException

前文提到的“万能捕手”except,其实际身份是Exception,Python默认省略了显式声明。实际上,它等价于:

except Exception:
    print("万能捕手在此,束手就擒吧!")

except与except Exception完全等价,日常编写中可根据个人习惯选择是否显式写出。而BaseException是Exception的父类,作为子类的Exception无法捕获父类BaseException类型的错误。

BaseException:包含所有内置异常(built-in exceptions)。

Exception:不包含所有内置异常,仅包含非系统退出类的异常(non-system-exiting exceptions)。例如SystemExit类型的异常就不包含在Exception中。Python中的所有错误均从BaseException类派生。

2.7 finally用法

finally块的作用是:无论except是否成功捕获到对应异常,finally下的代码均会被执行:

"""
参考如下代码:打开了love.txt这个文件,进行了阅读,又想写入一点东西,但现在是只读的模式,无法进行内容写入,故此会报错io.UnsupportedOperation
虽然没有写入成功,但是这个文件是成功读取了的,那么在文件的章节中提到过,如果打开了一个文件要记得关闭,否则其他人无法使用
所以在finally这里我们就可以加上f.close(),代表着无论是否有捕捉到异常,最后我都要关闭这个文件,以确保其他人能够正常使用该文件
"""
 
import io
 
try:
    f = open("love.txt", encoding="utf-8", mode="r")
    f.read()
    f.write("随便写点~")
except io.UnsupportedOperation:
    print("抓的就是你这个io.UnsupportedOperation报错")
finally:
    # finally的作用是无论except是否成功捕获到了对应的异常,均需要执行finally下的代码
    f.close()

2.8 异常信息的打印输出

虽然我们能捕获异常,但了解具体异常类型至关重要。在捕获到异常时,我们可以打印异常信息以便调试:

print("------------------- 欢迎来到报名注册系统 -------------------")
age = (input("请输入您的年龄:"))
 
try:
    age = int(age)
    if age < 18:
        print("很遗憾,您暂时不满足注册条件")
    else:
        print("恭喜您符合注册条件")
# 这里会报错ValueError,捕获的是IndexError,很明显无法进行异常捕获,那么我们可以在添加一个万能捕手except来进行捕获
except IndexError as error:
    print("您的年龄输入非法,请重新运行本程序")
# 在这里加一个as,后面接一个变量,然后进行变量打印即可,当出现对应的异常时就会打印对应异常的信息
except Exception as error:
    print("万能捕手在此,束手就擒吧!", f"已捕获异常:{error}")

前文提到except与except Exception等价,但若需使用as关键字绑定异常对象,则必须显式使用Exception。这是Python的语法规定:

# 正确用法,在捕获类型后加as 变量
except Exception as error:
    print("万能捕手在此,束手就擒吧!", f"已捕获异常:{error}")
 
# 错误的用法,不符合语法规则
except as error:
    print("万能捕手在此,束手就擒吧!", f"已捕获异常:{error}")

三、总结

本文介绍了Python自动化测试中的异常处理机制。更多相关Python异常处理内容,请搜索本站历史文章或继续浏览后续文章,希望大家多多支持本站!

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。