python中的异常
一、python中用异常对象(exception object)来表示异常的情况
遇到错误后,回引发异常。如果异常对象并未被处理或者捕捉,则程序就会用所谓的回溯(Traceback ,一种错误信息来终止)
try:
open(“abc。txt”,‘+r’)
except FileNotFoundError:
print(“异常了!”)
try:
open(aa)
except FileNotFoundError:
print(“异常了!”)
try:
open(aa)
except NameError:
print(“异常了!”)
异常的抛出机制:
1.如果在运行时发生异常,则解释器会查找相应的处理语句(成为handlder)
2.如果在当前的函数里没有找到的话,则它会将异常传递给上一层的调用函数,看看那里能不能处理
3.如果在最外层(全局main)还是没有找到的话,那么解释器就会推出,同时打印Traceback,以便让用户找到错误产生的原因
注:
1.虽然大多数错误会导致异常,但异常不一定代表错误,有时候他们呢只是一个警告,有时候时一个终止信号,例如退出循环等
2.在python中所有的异常类都继承Exception,所以可以使用他来接收所有类型的异常信息。
try:
open(aa)
except Exception:
print(“异常了!”)
3.从python2.5后,所有的异常类都有了新的基类BaseException。Exception同样也继承自baseException来接受所有类型的异常。
try:
open(aa)
except BaseException:
print(“异常了!”)
二、定位异常的位置
上面只是打印出异常信息,但是无法准确定位异常信息的位置。
try:
open(“abc.txt”,‘+r’)
except BaseException as msg:
print(msg)
注:在BaseException后面定义msg变量用于接收异常信息,并通过print将其打印出来。在python中用逗号代替as
三、python中常见的异常
异常 | 描述 |
BaseException | 新的有所异常类的基类 |
Exception | 所有异常类的基类,但继承BaseException类 |
AssertionError | assert语句失败 |
FileNotError | 试图代开一个不存在的文件或者目录 |
OsError | 当系统函数返回一个系统相关的错误,包括I/O故障,如“找不到文件”或者“磁盘已满”时,引发的异常 |
NameError | 使用一个还未赋值对象的变量 |
IndexError | 当一个序列超出了范围 |
SyntaxError | 当解析器遇到一个语法错误时引发 |
KeyBoardInterupt | ctrl+c被按下,程序被强行终止 |
TypeError | 传入的对象类型与要求不符 |
AttributeError | 试图访问的对象没有属性 |
四.更多异常用法
try:
aa = "测试异常:"
print(aa)
except Exception as msg:
print(msg)
else:
print("没有异常!")
这里对aa变量进行了赋值,所以没有异常将会执行else语句后面的内容。通常else语句只有在没有异常的情况下才会被执行。但有些情况下不管是否出现异常,这些操作都希望能被执行,例如文件的关闭,锁的释放,把数据库连接返还给链接池等操作。我们可以通过使用try。。。except。。。finally...语句来实现这样的需求。
try:
#aa = "测试异常:"
print(aa)
except Exception as e:
print(e)
finally:
print("没有异常!")
注:msg和e的功能一样
@@@下面定义aa变量
try:
aa = "测试异常:"
print(aa)
except Exception as msg:
print(msg)
finally:
print("没有异常!")
注:无论是否有异常finally语句都会执行
五:抛出异常
print()方法只能答应错误信息,python中提供了raise方法来抛出一个异常信息,下面演示raise的用法。
from random import randint
number = randint(1,9)
if number % 2==0:
raise NameError("%d is even"% number)
else:
raise NameError("%d is odd"% number)
注:通过randint()方法随机生成1到9之间的整数,然后判断这个数字时骑术还是偶数。最后通过raise抛出NameError异常,其实判断奇偶数与NameError之间没有任何关系,这里只是为了掩饰如何通过raise抛出各种类型的异常。
**raise只能使用python中所提共的异常类,如果自定义一个abcError的异常,则python会告诉你ascError没有定义