A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

一、什么是异常

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
版权声明:本文为博主原创文章,转载请附上博文链接!

1 个回复

倒序浏览
奈斯,感谢分享
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马