异常处理语句

在程序的编写过程中会出现各种错误,语法错误在程序启动时就会检测出来,它是程序正常运行的前提条件。程序中还有一种错误发生在程序运行后,可能是由于逻辑问题,又或者是业务发生了改变,为了能让用户有更好的体验,加强代码的健壮性,我们需要对这些错误进行处理,也叫异常处理。
在python中不同的异常可以用不同的类型(python中统一了类与类型,类型即类)去标识,不同的类对象标识不同的异常,一个异常标识一种错误

程序运行中的异常可以分为两类:语法错误和逻辑错误。首先,我们必须知道,语法错误跟异常处理无关,所以我们在处理异常之前,必须避免语法上的错误。

在 python 中通过 try-except 语句进行异常处理。
try-except 语句的基本语法格式如下:

try:
<语句块1>
except <异常类型1>:
<语句块2>
except <异常类型2> :
<语句块3>
else:
<语句块4>
finally:
<语句块5>
语句块 1 中的代码如果发生异常,且异常与类型与对应 excep 语句中的异常类型相同则会被其捕获,从而执行对应的语句块
没有发生异常时,会执行 else 语句后的代码块,不管有没有发生异常,finally 语句后的代码块一定会执行

常见异常类型
AttributeError 试图访问一个对象没有的树形,比如foo.x,但是foo没有属性x
IOError 输入/输出异常;基本上是无法打开文件
ImportError 无法引入模块或包;基本上是路径问题或名称错误
IndentationError 语法错误(的子类) ;代码没有正确对齐
IndexError 下标索引超出序列边界,比如当x只有三个元素,却试图访问x[5]
KeyError 试图访问字典里不存在的键
KeyboardInterrupt Ctrl+C被按下
NameError 使用一个还未被赋予对象的变量
SyntaxError Python代码非法,代码不能编译(个人认为这是语法错误,写错了)
TypeError 传入对象类型与要求的不符合
UnboundLocalError 试图访问一个还未被设置的局部变量,基本上是由于另有一个同名的全局变量,
导致你以为正在访问它
ValueError 传入一个调用者不期望的值,即使值的类型是正确的

在python的异常中,有一个万能异常:Exception,他是所有异常的父类,可以捕获任意异常。它是一把双刃剑,有利有弊,我们要视情况使用

  如果你想要的效果是,无论出现什么异常,我们统一丢弃,或者使用同一段代码逻辑去处理他们,那么只有一个Exception就足够了。

  如果你想要的效果是,对于不同的异常我们需要定制不同的处理逻辑,那就需要用到多分支了。我们可以使用多分支+万能异常来处理异常。使用多分支优先处理一些能预料到的错误类型,一些预料不到的错误类型应该被最终的万能异常捕获。需要注意的是,万能异常一定要放在最后,否则就没有意义了。

我们可以使用except与as+变量名 搭配使用,变量名存储的是具体的错误信息,打印变量名会直接输出报错信息
def dealwith_file():
try:
f = open('file',encoding='utf-8')
for line in f:
int(line)
return True
except Exception as e:
print(e)
return False
finally:
'''不管try语句中的代码是否报错,都会执行finally分支中的代码'''
'''去完成一些连接操作的收尾工作'''
print('finally 被执行了')
f.close()
ret = dealwith_file()
print(ret)

主动触发异常
try:
raise TypeError('类型错误')
except Exception as e:
print(e)

先完成功能 在测试的时候 一边修改代码 一边加上异常处理,只要加上异常处理,一定要写日志,不要在大段的代码外直接套上异常处理。应该是在具体的逻辑上(具体的细节处的代码段)加上细粒度异常处理。对于可以预料到的异常 一定要尽力的疏导 如果不能解决 必须要写上提示以及引发错误的原因

assert断言是声明其布尔值必须为真的判定,如果发生异常就说明表达示为假。可以理解assert断言语句为raise-if-not,用来测试表示式,其返回值为假,就会触发异常。

assert的异常参数,其实就是在断言表达式后添加字符串信息,用来解释断言并更好的知道是哪里出了问题。格式如下:
assert expression [, arguments]
assert 表达式 [, 参数]

assert len(lists) >=5,'列表元素个数小于5'
assert 2==1,'2不等于1'
备注:格式:assert 条件 , 条件为false时的错误信息 结果为raise一个AssertionError出来

posted @ 2020-10-31 17:47  shero2020  阅读(483)  评论(0编辑  收藏  举报