异常
异常 |
一、异常的概述
程序中难免出现错误,而错误分成两种:语法错误与逻辑错误。而异常就是程序运行时发生错误的信号。
我们简单举个异常的例子,即:
l = [0,1] print(l[2]) #抛出异常
上述代码可以看出下标索引超出序列边界,就抛出了一个异常。
二、常用的异常
在Python中,不同原因导致的异常说明是不同的。下面我们来介绍一些常用的异常,如下表所示:
异常类 | 描述 |
AttributeError |
试图访问一个对象没有的属性,比如foo.x,但是foo没有属性x |
IOError |
输入/输出异常;基本上是无法打开文件 |
ImportError |
无法引入模块或包;基本上是路径问题或名称错误 |
IndentationError |
语法错误(的子类) ;代码没有正确对齐 |
IndexError |
下标索引超出序列边界,比如当x只有三个元素,却试图访问x[5] |
KeyError |
试图访问字典里不存在的键 |
KeyboardInterrupt |
Ctrl+C被按下 |
NameError |
使用一个还未被赋予对象的变量 |
SyntaxError |
Python代码非法,代码不能编译(个人认为这是语法错误,写错了) |
TypeError |
传入对象类型与要求的不符合 |
UnboundLocalError |
试图访问一个还未被设置的局部变量,基本上是由于另有一个同名的全局变量,导致你以为正在访问它 |
ValueError |
传入一个调用者不期望的值,即使值的类型是正确的 |
三、异常处理
异常处理就像人们平时对可能遇到的意外情况,预先想好了一些处理方法。若发生了异常,程序会按照预定的处理方法对异常进行处理,异常处理完毕后,程序继续运行。
我们通常使用Python提供的try-except语句来处理异常,把可能出现异常的代码放入try语句块中,并使用except语句块来处理异常。
具体异常处理语法结构为:
try: 被检测的代码块 except 异常类型: try中一旦检测到异常,就执行这个位置的逻辑
当然except后面也可以跟着多个有可能的异常类型,即:
try: 被检测的代码块 except 异常类型1: try中一旦检测到异常1,就执行这个位置的逻辑 except 异常类型2: try中一旦检测到异常2,就执行这个位置的逻辑 except 异常类型3: try中一旦检测到异常3,就执行这个位置的逻辑
当然也有一个万能异常类型,就是Exception。
四、异常补充点
除了标配的异常的结构try-except,在except后面可以跟上else语句和finally语句。
else表示try语句块可以正常执行,那么就执行else里面的语句,finally表示无论异常与否,都会执行该finally里面的语句,通常是用来进行清理工作。
具体代码实现如下:
s1='hello' try: int(s1) except IndexError as e: print(e) except KeyError as e: print(e) except ValueError as e: print(e) else: print('try内代码块没有异常则执行我') finally: print('无论异常与否,都会执行该模块,通常是进行清理工作') print('----------')
执行结果为:
invalid literal for int() with base 10: 'hello' 无论异常与否,都会执行该模块,通常是进行清理工作 ----------
从输出结果可以看出,不管try语句块是否出现异常,最终finally里的语句都输出了。
五、使用raise抛出异常
在Python中,程序运行出现错误时就会引发异常,但是有时候,也需要在程序中主动抛出异常,执行这种操作可以使用raise语句。即:
print('我要主动抛出异常啦!!!') raise IndexError #格式:raise 异常名
当然也可以在异常名后定义参数,参数就是异常值,即:
print('我要主动抛出异常啦!!!') raise IndexError('索引出界了')
六、自定义异常
在Python中,内置了许多的异常类,但是很难满足我们所有的需求,所以也可以自定义异常。
自定义异常代码如下:
class newException(Exception): #自定义异常需要继承Exception类 pass