异常

异常

一、异常的概述

程序中难免出现错误,而错误分成两种:语法错误与逻辑错误。而异常就是程序运行时发生错误的信号。

我们简单举个异常的例子,即:

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

 

posted @ 2019-08-09 17:16  流浪代码  阅读(219)  评论(0编辑  收藏  举报