认识异常
Python用异常对象(Exception Object)来表示异常情况,在遇到错误后,异常对象会引发异常,如果异常对象并未被处理过被捕捉到程序责会利用回溯(Trackback)一种错误现象来终止程序
open("text.txt",'r')
我们通过open方法以只读的形式打开一个文件然后pyhon抛出一个FileNotFoundError类型的异常,他告诉我们No such file or directory :"test.txt" 没有test.txt这样的文件或目录
因为我们没有创建这样的文件所有才才找不到
既然我们知道打开一个不存在的文件时Pyhon会抛出一个
FileNotFoundError,按我我们可以通过Python提供的 try except 语句来捕捉并处理这个异常
创建test.py文件并写出一下代码
try :
open("abc.txt",'r')
except
FileNotFoundError
print("异常了啊")
再次运行程序因为 try except 捕捉到FileNotfoundError 异常 所以会打印)(异常了啊)
再次修改程序,使其打印一个没有定义的比变量a
try :
print(a)
except FileNotFoundError
print("异常了啊")
我们不是已经通过 try except 来接收异常信息了吗为什么还是会报错呢,细品就会发现这次的错误是 NameError类型的错误而FileNotFoundError 只能接收找不到文件类型的错误 驴唇不对马嘴的意思 这里我们只需要将异常的类型改为NameError就可以了
try :
print(a)
except NameError :
print("异常了啦")
知识延伸:异常的抛出机制
1.如果在程序运行中发生异常,那么解释器会查找相应的处理语句称为(handler)
2.如果在当前函数里没有找到相应的处理语句,那么解释器会将异常传递给上层的调用函数,看看上层函数能否处理
3.如过在最外层函数全局函数main() 也没有找到,那么解释器会退出,同时打印Traceback,以便让用户找到错误原因
注意:虽然大多数错误都会导致异常,但异常也不一定代表错误,有时候他们只是个警告,有时候是个终止信号,如退出循环等
在Python中,所有的异常类都继承自Exception 但自pyhon2.5后所有的异常类就有了新类BaseException,Exception同样也继承与BaseException 所以我们可以使用BaseException来接收所有类型的异常
try :
print(a)
open("adb.txt",'r')
except BaseException :
print("异常了啦")
对于以上异常,BaseException就能捕捉到异常并打印异常了,但是我们不知道具体时间哪一行出现了异常 如何让Pyhon告诉我们是哪一行代码出现了错误
try :
print(a)
open("adb.txt",'r')
except BaseException as mag :
print("异常")
print(mag)
我们在 BaseException 后面定义了一个msg 变量来接收异常信息,并通过 print()将其打印出来,运行结果如下
name 'a' is not defined
Pyhon 中常见的异常
BaseException 所有异常的基类
Exception 所有异常的基类 但继承与BaseException
AsscrtionError assert语句失败
FileNotFoundError 试图打开一个不存在的文件或目录
AttribuleError 试图访问的对象没有属性
OSEerror 当系统函数返回一个系统相关函数(包括I/O故障),如找不到文件或磁盘已满时引发此异常
NameErro 使用一个未赋值的变量对象
IndexError 当一个序列超出范围时引发此异常
SyntaxError 当解析器遇到一个语法错误时引起的异常
KeyboardInterrupt 当按下Ctrl+C,程序被强行终止
TypeError 传入的对象类型与要求不符合
通过前面的学习我们了解到了一般的异常用法下面学习更多的异常用法 如 try except esle 用法
try:
a="异常测试"
#a=input("请输入")
print(a)
except NameError as msg:
print(msg)
else :
print("异常没有被执行")
这里我们对变量a进行了赋值,如果没有发生异常,则会执行else语句后的内容
有时候不管我们希望异常是否出现,有些操作都会执行,例如文件的关闭,锁的释放,把数据库的连接返回连接池等,我们可以使用try except finally 实现这样的需求
try :
a="12"
print(a)
except NameError as msg :
print(msg)
finally :
print("不管是否出现异常都会执行")
我们在给上面的a赋值以后再次运行验证finally语句是否被执行
如果你开发的是一个python的第三方库或框架,那么在程序运行时发生异常抛出异常现实的更为专业 在python中 raise关键字可用来抛出一个异常信息,下面的例子演示了raise的用法
def sys_hello(name=None):
if name is None:
raise NameError("错了")
else:
print("hello %s" %name)
sys_hello()
首先定义say_hello函数,设置参数name未None ,为函数中判断参数name如果未None,则抛出NanmeError提示(错了)否则打印hello
需要注意的是raise只能使用pyhon提供的异常类,如果想要raise使用自定义类,则自定义类需要继承Exception类