一、什么是异常处理?
异常就是使用异常对象来表现异常,若程序在编译或执行过程中,发生一些错误,程序的执行过程会发生改变,抛出异常对象,就会进入异常处理。若没有异常处理,那么将会终止在当前异常处,后面的代码将不会在继续执行
常见的异常错误
二、python中的异常种类
1、NameError:尝试访问一个未申明的变量
>>> v
NameError: name 'v' is not defined
2、ZeroDivisionError:除数为0
>>> v = 1/0
ZeroDivisionError: int division or modulo by zero
3、SyntaxError:语法错误
>>> int int
SyntaxError: invalid syntax (<pyshell#14>, line 1)
4、IndexError:索引超出范围
>>> List = [2]
>>> List[3]
Traceback (most recent call last):
File "<pyshell#18>", line 1, in <module>
List[3]
IndexError: list index out of range
5、KeyError:字典关键字不存在
>>> Dic = {'1':'yes', '2':'no'}
>>> Dic['3']
Traceback (most recent call last):
File "<pyshell#20>", line 1, in <module>
Dic['3']
KeyError: '3'
6、IOError:输入输出错误
>>> f = open('abc')
IOError: [Errno 2] No such file or directory: 'abc'
7、AttributeError:访问未知对象属性
>>> class Worker:
def Work():
print("I am working")
>>> w = Worker()
>>> w.a
Traceback (most recent call last):
File "<pyshell#51>", line 1, in <module>
w.a
AttributeError: 'Worker' object has no attribute 'a'
8、ValueError:数值错误
>>> int('d')
Traceback (most recent call last):
File "<pyshell#54>", line 1, in <module>
int('d')
ValueError: invalid literal for int() with base 10: 'd'
9、TypeError:类型错误
>>> iStr = '22'
>>> iVal = 22
>>> obj = iStr + iVal;
Traceback (most recent call last):
File "<pyshell#68>", line 1, in <module>
obj = iStr + iVal;
TypeError: Can't convert 'int' object to str implicitly
10、AssertionError:断言错误
>>> assert 1 != 1
Traceback (most recent call last):
File "<pyshell#70>", line 1, in <module>
assert 1 != 1
AssertionError
三、异常处理的基本语法格式
1、在程序开发中,如果对某些代码的执行不确定(程序的语法无法正确)
try的工作原理:
执行一个try语句时,python解析器会在当前程序流的上下文中作标记,当出现异常后,程序流能够根据上下文的标记回到标记位,从而避免终止程序。
1. 如果try语句执行时发生异常,程序流跳回标记位,并向下匹配执行第一个与该异常匹配的except子句,异常处理完后,程序流就通过整个try语句(除非在处理异常时又引发新的异常)。
2. 如果没有找到与异常匹配的except子句(也可以不指定异常类型或指定同样异常类型Exception,来捕获所有异常),异常被递交到上层的try(若有try嵌套时),甚至会逐层向上提交异常给程序(逐层上升直到能找到匹配的except子句。实在没有找到时,将结束程序,并打印缺省的错误信息)。
可以增加try来捕获异常
try:
尝试执行的代码
expect:
出现错误的异常处理
实例:
结果显示
由下图片可以看出,若输入正确,那么直接打印出一串,若输入的数不是整型,那么,将会进入异常处理阶段,之后在打印出一串3
2、两种异常处理处理格式
try:
尝试执行的代码
expect:
出现错误的异常处理1
expect:
出现错误的异常处理2
实例
需求
1.显示用户输入一个整数
2.使用10除以用户输入的整数并且可以输出
3.若输入的数不是整数,那么转向异常处理
若输入的数的类型正确,那么结果显示如下图所示
若输入的数的类型不正确,那么结果如下图
若输入的数为0,结果显示如下
捕获未知错误
在开发的时候,要判断所有可能出现的错误,是有一定的难度,
如果希望程序无论出现任何错误,都不会因为python解释器抛出异常而终止,
可以再增加一个except
实例
结果显示
3、try …except…else…finally基本格式
try
#尝试执行的代码
pass
except 错误类型1:
pass
expect Exception as result:
else:
#没有异常处理才会执行的代码
finally:
#无论是否有异常,都会执行的代码
pass
实例
结果显示
输入的数为整数,显示成功
若输入的类型不正确,那么将进行异常处理,输出请输入正确的整数
若输入为0,那么 输出未知错误额信息
4、异常处理中的函数
若输入的数为整数时,那么输出的是你所要输入的数
若输入的数不正确,那么将会出现以下的错误
5、异常的传递
异常的传递–当函数/方法出现异常,会将异常传递给函数/方法调用的一方,如果传递到主程序,依旧没有异常处理,程序才会终止,可以在主程序中增加异常捕获,而在主函数中调用其他函数,只要出现异常,都会传递到主函数的异常,捕获中,这就不需要在代码中,增加大量的异常捕获,都能够保持代码的整洁
综合案例
需求:
判断用户输入的密码
1.<8 错误
2.>=8 返回输入的密码
如果密码长度不够,那么输出密码长度不够的结果信息
如果密码长度一致,那么输出密码
6、触发异常raise
raise关键字后跟异常的名称,异常名称能够标识出异常类的对象。执行raise语句时,python会创建指定异常类的对象,还能够指定对异常对象进行初始化的参数,参数也可以为由若干参数组成的元组。
注意:一旦执行raise语句,程序就会被终止。
格式:raise [exceptionType[,argument][,traceback]]
结果显示