z天赐

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

  异常处理  

 

 简介 

在我们写程序代码的时候,往往会因一个小问题让我们整个程序直接挂掉。

异常处理对我们测试有什么好处,相信做过自动化的同学都知道我们的用例都是一条一条的去执行比如我们程序用例几百条,有一条用例因数据原因导致了程序异常,那么剩下的就会全体停止工作,遇到这样的情况我们应该将这个数据导致的问题抛出来,处理这个异常就可以了。

我们可以使用 try except 的方式来处理异常。

 

 结构  

将有可能发生报错的语句放到try:里面,然后使用except来处理异常,每一个try 必须至少有1个except。

如果可能发生报错的语句我们能知道要报哪些异常,except 后需要跟上异常名称

也可以使用万能异常Exception,他可以捕获任意异常

python所有的标准异常类:请看文章末尾处

 

 实例1:处理指定错误异常类型

如果我们知道会报那些错误,那么就可以直接来捕捉处理就好了,但是如果捕捉异常名称不正确,则也会程序报错。

首先我们打印一个未声明/初始化对象 (没有属性)的错误,然后再后面再打印一个正常能被执行的数据

1 print(aa)
2 print('bb')

 

打印结果

Traceback (most recent call last):
  File "C:\Users\张天赐\PycharmProjects\pythonProject\test\lianxi\111.py", line 6, in <module>
    print(a)
NameError: name 'a' is not defined

  

显然print("bb")没有被执行,我们此时对我们可能或者已知报错的部分增加try:并且用except 指定NameError as 到f变量,并且打印出这个错误

try:
    print(aa)
except NameError as f:
    print(f)
print('bb')

打印结果

name 'aa' is not defined
bb

 可以看出,程序将报错信息打印了出来,然后执行了print("bb")

假如我是打开一个错误的文件呢?我又不知道打开文件错误的名称,这时候我又怎么处理呢?

try:
    open('ztc.txt','r')
except NameError as f:
    print(f)
print('bb')

打印结果:

实际是输出错误文件,我用Nameerror是不能正确找到该异常名称的

Traceback (most recent call last):
  File "C:\Users\张天赐\PycharmProjects\pythonProject\test\lianxi\111.py", line 2, in <module>
    open('ztc.txt','r')
FileNotFoundError: [Errno 2] No such file or directory: 'ztc.txt'

遇到这样的情况请看实例2

 

 实例2 :万能的异常处理 

实例1中我们说了,在我们能确定会报什么类型的错误的时候,我们可以指定这个错误类型来处理他,当然在很多时候,我们会遇到很多的未知异常,不可能将所有异常都预知到,那么我们可以直接用万能异常Exception

try:
    open('ztc.txt','r')
except Exception as f:
    print(f)
print('bb')

打印结果:

 无论我们try中是任何错误类型的异常,exception都可以来处理他

[Errno 2] No such file or directory: 'ztc.txt'
bb

 

  实例3:try...finally... 

try...finally...的意思是,我们程序是否遇到错误,这些代码必须执行

都有哪些场景可以用到? 

比如我们链接数据库,要操作数据库,程序报错了或者没报错, 都必须要执行关闭数据库
比如我们打开一个excel或者txt文档,要写入数据,无论报错或者没报错,都必须关闭这个文档

 

先看一个执行正常的情况

try:
    f = open('ztc.json','r')

finally:
    f.close()
    print('已经关闭')

打印结果

已经关闭

再看看如果打开文件后,还没等文件关闭呢,就报错了

try:
    f = open('ztc.json','r')
    print(aaa)

finally:
    f.close()
    print('已经关闭')

打印结果

Traceback (most recent call last):
  File "C:\Users\张天赐\PycharmProjects\pythonProject\test\lianxi\111.py", line 3, in <module>
    print(aaa)
NameError: name 'aaa' is not defined
已经关闭

看上面代码,显然程序打印print(aaa)的时候报错了,但是依然将打开的文件给关闭了

 

 

 

 附录:

异常名称描述
BaseException 所有异常的基类
SystemExit 解释器请求退出
KeyboardInterrupt 用户中断执行(通常是输入^C)
Exception 常规错误的基类
StopIteration 迭代器没有更多的值
GeneratorExit 生成器(generator)发生异常来通知退出
SystemExit Python 解释器请求退出
StandardError 所有的内建标准异常的基类
ArithmeticError 所有数值计算错误的基类
FloatingPointError 浮点计算错误
OverflowError 数值运算超出最大限制
ZeroDivisionError 除(或取模)零 (所有数据类型)
AssertionError 断言语句失败
AttributeError 对象没有这个属性
EOFError 没有内建输入,到达EOF 标记
EnvironmentError 操作系统错误的基类
IOError 输入/输出操作失败
OSError 操作系统错误
WindowsError 系统调用失败
ImportError 导入模块/对象失败
KeyboardInterrupt 用户中断执行(通常是输入^C)
LookupError 无效数据查询的基类
IndexError 序列中没有没有此索引(index)
KeyError 映射中没有这个键
MemoryError 内存溢出错误(对于Python 解释器不是致命的)
NameError 未声明/初始化对象 (没有属性)
UnboundLocalError 访问未初始化的本地变量
ReferenceError 弱引用(Weak reference)试图访问已经垃圾回收了的对象
RuntimeError 一般的运行时错误
NotImplementedError 尚未实现的方法
SyntaxError Python 语法错误
IndentationError 缩进错误
TabError Tab 和空格混用
SystemError 一般的解释器系统错误
TypeError 对类型无效的操作
ValueError 传入无效的参数
UnicodeError Unicode 相关的错误
UnicodeDecodeError Unicode 解码时的错误
UnicodeEncodeError Unicode 编码时错误
UnicodeTranslateError Unicode 转换时错误
Warning 警告的基类
DeprecationWarning 关于被弃用的特征的警告
FutureWarning 关于构造将来语义会有改变的警告
OverflowWarning 旧的关于自动提升为长整型(long)的警告
PendingDeprecationWarning 关于特性将会被废弃的警告
RuntimeWarning 可疑的运行时行为(runtime behavior)的警告
SyntaxWarning 可疑的语法的警告
UserWarning 用户代码生成的警告

 

posted on 2021-10-20 20:22  z天赐  阅读(250)  评论(0编辑  收藏  举报