一、什么是异常
1. 异常(也称错误 )
执行代码期间遇到的突发状况所引出(或抛出)。
2. 处理异常
若在代码上下文中有处理异常的代码,异常会被捕获,否则,异常可能导致解释器停止运行程序,并向控制台发送合适的信息。
二、常见错误类型
Exception类是所有异常类的基类,各子类的实例都编码成已发生问题的细节。
异常类名 描述
Exception 所有异常类的基类
AttributeError 若对象obj没有foo成员,会由语法obj.foo引发
Exception 所有异常类的基类
Exception 所有异常类的基类
Exception 所有异常类的基类
Exception 所有异常类的基类
Exception 所有异常类的基类
Exception 所有异常类的基类
(待更新)
三、抛出异常
1. 抛出异常
当执行到带有异常类的实例(以指定问题作为参数)的raise语句时,就会抛出异常。
例如,计算平方根的函数传递了一个负数作参数时,会引发有如下命令的异常:
raise ValueError('X cannot be negative')
随着这个错误信息(指‘X cannot be negative’)作为构造函数的一个参数,该语法会生成一个新创建的ValueError类实例。
如果这个异常在函数体内未被捕获,函数执行会立刻停止,且这个异常可能会被传播到调用的上下文(甚至更远)。
2. 检查函数参数
检查一个函数参数的有效性,先验证参数类型是否正确,然后验证参数值的正确性。
例如,python的math库中,求平方根函数sqrt函数的错误检测代码如下:
def sqrt(x):
if not isinstance(x,(int,float)): #检查x是否是整型/浮点型
raise TypeError('x must be numeric')
elif x < 0: #检查x是否是非负数
raise ValueError('x cannot be negative')
1
2
3
4
5
3.执行错误检测和简单实现的平衡
要对函数执行多少次错误检测是一个有争议的问题,检查参数的类型和数值需要额外的执行时间,如果走向极端似乎与python的本质不符。
四、捕获异常
1.处理异常的理念
理念1:三思而后行
要完全避免异常发生,则要积极地条件测试。例如,为了避免除法x/y中除数为0的情况:
if y!=0:
ratio = x/y
else:
…do somethin else…
1
2
3
4
理念2:try-except机制 —— “请求原谅比得到许可更容易”
即不需要花额外的时间维护每一个可能发生的异常,只要异常发生时有个处理问题的机制就可以。例如:
try:
ratio = x / y
except ZeroDivisionError:
…do something else…
1
2
3
4
其中try块后会跟着一个或多个except字句,try中的代码是要执行的,当发生错误时,剩下的语句会直接跳过。
如果try块中引发了指定的错误,确定的错误类型和缩进代码块都要被执行。
2、try-except结构的优势与使用场景
优势:
它的优势是,非特殊情况下高效运行(实际上,在处理异常时,try-except结构比使用一个标准的条件语句会需要更多的时间)
使用场景:
我们相信异常相对不可能,或主动评估条件来避免异常代价非常高时。
例如,当用户输入/读取文件时,有一些情况是不可预测的(如打开一个不存在的文件、缺乏足够的权限打开文件等IOError),在此情况下捕捉错误结果比准确预测命令是否成功会更容易:
try:
fp = open('sample.txt')
except IOError as e: #e表示抛出的异常的实例
print ('Unable to open the file:',e)
1
2
3
4
3.try-except结构的应用
捕获多个异常:
age = -1
while age < =0:
try:
age = int(input('Enter your age in years:'))
if age <= 0:
print('Your age must be positive')
except (ValueError,EOFError): #用一个tuple元祖捕捉函数(int())参数类型不正确和控制台输入
出错异常
print(‘Invalid response’)
1
2
3
4
5
6
7
8
9
若希望在不输出‘‘Invalid response’’的情况下继续while循环,可改为:
except (ValueError,EOFError):
pass
1
2
对不同类型错误提供不同响应:
age = -1
while age < =0:
try:
age = int(input('Enter your age in years:'))
if age <= 0:
print('Your age must be positive')
except ValueError:
print(‘That is an invalid age specification')
except EOFError:
print(‘There was an unexpected error reading input’)
1
2
3
4
5
6
7
8
9
10
希望异常能中断循环并传达给上下文:
可以将上例改为
age = -1
while age < =0:
try:
age = int(input('Enter your age in years:'))
if age <= 0:
print('Your age must be positive')
except ValueError:
print(‘That is an invalid age specification')
except EOFError:
print(‘There was an unexpected error reading input’)
raise #重新抛出目前正在处理的相同的异常
---------------------
【转载,仅作分享,侵删】
作者:琪仔要转行回coder
来源:CSDN
原文:https://blog.csdn.net/lllllaaa77/article/details/87539597
版权声明:本文为博主原创文章,转载请附上博文链接!
|
|