断言和异常处理

Zss 发表于:

程序中的错误太常见了,这些错误称之为异常,那么当这些错误可能出现的时候,可以使用try语句来捕获这些异常,并且进行相应的一些操作

这样子就不会直接造成程序的奔溃,使其脚本变得更加健壮,之前在写一些异常处理时,我是直接忽略所有的异常,因为在一个某些脚本中循环的操作

可能会带来一些异常,但是一次的异常并不会造成什么影响,所以直接忽略掉进入下一次循环的操作,但是这样子是不好的,看不到异常类型,虽然我也并不需要看。。。

不过还是总结一下python的异常操作处理

1.忽略所有异常且不任何操作

try:

语句块

except:pass

try:
    print(a)
except:pass
print 'pass'

a实际上没有定义,会出现一个异常,然而程序正常运行,直接会忽略掉错误,打印pass

像这种情况下是没有任何信息提示的,在调试时就真不能这么用,不然有问题是根本不知道在哪里

2.捕获常规的异常类,且打印错误信息

可以捕获除与程序退出sys.exit()相关之外的所有异常

老版本的Python,except语句写作”except Exception, e”,Python 2.6后应写作”except Exception as e”

try:
    print(a)
except Exception as e:
    print '错误信息:',e

输出:
错误信息: name 'a' is not defined
try:
    a = 's'+1
except Exception as e:
    print '错误信息:',e

输出:
错误信息: cannot concatenate 'str' and 'int' objects
3.当程序未出现错误时执行的语句
try:
    语句1
except:
    语句2
else:
    #没有错误可以去做别的事情
    语句3

当语句1执行出现了错误那么执行语句2,不执行语句3

当语句1执行未出现错误那么执行语句3,不执行语句2

try:
    a = 's'+'s'
except BaseException as e:
    print '错误信息:',e
else:
    print('没有出错了执行的程序')

输出:
没有出错了执行的程序
4.不能论程序正确与否都执行的语句

当try中出现错误时,跳过出错后的语句,直接执行finally中的语句

若try中未出现错误,顺序执行下来

try:
    pass
finally:
    #如果没有捕获到异常。代码执行。
    #如果捕获到异常,先执行这个,然后丢给解释器进行处理异常。
    #总之就是无论如何都会做这个操作。
    pass
try:
    a = 's'+1
finally:
    print('无论如何都执行的语句')

输出:
无论如何都执行的语句
Traceback (most recent call last):
  File "C:/Users/Zss-pc/Desktop/Py/�쳣����/�쳣����.py", line 4, in <module>
    a = 's'+1
TypeError: cannot concatenate 'str' and 'int' objects

添加一个异常后,再执行finally

try:
    pass
except:
    # 处理异常
    pass
finally:
    # 必须做的事
    pass

# 1、如果try 没有捕获到异常,执行finally语句。
# 2、如果捕获到了异常先处理异常,然后执行finally
try:
    a = 's'+1
except BaseException as e:
    print '错误信息:',e
else:
    print('没有出错,执行的语句')
finally:
    print('无论如何都执行的语句')

输出:
错误信息: cannot concatenate 'str' and 'int' objects
无论如何都执行的语句
5.断言处理

assert断言是声明其布尔值必须为真的判定,用来测试表示式,其返回值为假,就会触发异常,那么在平时测试脚本的编写时,断言就有很大的用处了,譬如:定义一个测试某段程序的,某个功能的函数或者方法,若正确则返回True,若失败则返回False,配合上try语句的异常捕获,和断言的处理,可以很好的处理测试的结果

需要注意的是,assert语句一般用于开发时对程序条件的验证,只有当内置_debug_为True时,assert语句才有效。当Python脚本以-O选项编译成为字节码文件时,assert语句将被移除。

也就是当 assert True 时,此时正常,若为False,那么则引发异常,当发生异常时,可以使用自定义的异常字符串打印出来就可以知道是什么东西错了,用例的运行也就知道了哪里失败了

try:
    assert len([1,2,3]) >= 5, '列表元素个数小于5'
except Exception as e:
    print e
else:
    print('列表元素个数大于5')
try:
    a = ''
    assert type(a) == int, '输入不为整型'
except Exception as e:
    print e
else:
    print('输入为整型')
6.多个异常的处理

只会捕获第一个异常,如果异常没有被第一个except语句块处理,那么它也许被下一个语句块处理,或者根本不会被处理

try:
    aa
    file = open('test.txt', 'rb')
except NameError as e:
    print("An Name error occurred.")
    raise e
except IOError as e:
    print("An error occurred.")
    raise e

输出:
An Name error occurred.
Traceback (most recent call last):
  File "C:/Users/Zss-pc/Desktop/Py/�쳣����/�쳣����.py", line 8, in <module>
    raise e
NameError: name 'aa' is not defined

或者将其放置在一个元组中

try:
    a
    file = open('test.txt', 'rb')
except (IOError, NameError) as e:
    print("An error occurred. {}".format(e.args[-1]))

标准异常类型:

BaseException 所有异常的基类
SystemExit 解释器请求退出
KeyboardInterrupt 用户中断执行(通常是输入^C)
Exception 常规错误的基类
StopIteration 迭代器没有更多的值
GeneratorExit 生成器(generator)发生异常来通知退出
StandardError 所有的内建标准异常的基类
ArithmeticError 所有数值计算错误的基类
FloatingPointError 浮点计算错误
OverflowError 数值运算超出最大限制
ZeroDivisionError 除(或取模)零 (所有数据类型)
AssertionError 断言语句失败
AttributeError 对象没有这个属性
EOFError 没有内建输入,到达EOF 标记
EnvironmentError 操作系统错误的基类
IOError 输入/输出操作失败
OSError 操作系统错误
WindowsError 系统调用失败
ImportError 导入模块/对象失败
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 用户代码生成的警告