学习Python的第九节课(异常概念、异常处理机制和自定义异常和传递异常)
一、异常概念
1、异常的定义
概述异常的定义:异常是指程序运行时引发的错误,原因很多,如除
数为0、下标越界、文件不存在、类型错误、键值错误、磁盘空间不
足、下标越界、网络异常、类型错误、名字错误、字典键错误等错
误。
2、异常的种类
python程序中的异常通常分为语法错误、逻辑错误和运行错误。
(1)语法错误
源代码中的拼写语法错误,这些错误导致Python编译器无法把Python源
代码转换为字节码,故也称之为编译错误。
(2)逻辑错误
逻辑错误是程序运行本身不报错,但执行结果不正确。对于逻辑错误,
Python解释器无能为力,需要用户根据结果来调试判断。
(3)运行错误
运行时错误是在程序运行时排除的异常,例如,分母为0、文件找不到、
模块没导入等。
3、python的内建异常类
Python所有异常的基类是BaseException类。
通过关系图的方式讲解异常类之间的继承关系。
二、异常处理机制
异常处理是指因为程序执行过程中出错而在正常控制流之外采取的行为。在实
际应用中,对某些异常采取适当的处理很有必要。
1、异常的基本处理结构
异常处理结构中最常见、最基本的是try…except…结构。
2、抛出异常:raise语句
除了程序运行出现异常、系统触发异常并进行相应处理外,我们也可以使用
raise语句自己触发异常。raise语法格式如下:
raise [异常 [,参数 [,回溯]]]
raise [Exception [, args [, traceback]]]
其中,语句中Exception是异常的类型(例如,NameError),参数是一个异常
参数值,默认是None。回溯参数如果存在,是跟踪异常对象。
3、断言
断言的主要功能是帮助程序员调试程序,以保证程序运行的正确性,断言一般
在开发调试阶段使用。
Assert语句格式如下:
assert Expression, e
当Expression部分为True时,则正确执行,程序继续下去;当判断为False时,
则抛出后面的e错误提示。
a = 0
assert a!=0,"a的值不能为0"
在大型的项目中,assert常被用来作为“防御性编程”
三、自定义异常和传递异常
1、异常的嵌套传递
(1) try嵌套传递
异常代码块可以嵌套,当内层代码出现异常,但是指定的异常类型与实际不符
合时就会向外层传递。若还不符合再向外层传递,如果最后还是没有找到指定
的类型就会由Python解释器处理。
内层try指定的异常类型与实际发生的异常不符合,就会传递到外层的try,正好外层的
try指定处理的异常类型就是实际发生的异常类型,因此结果如上所示。
(2) 函数嵌套调用传递
异常的传递:
从产生异常的地方开始传递到调用异常的地方,如果一直没有处理异常,会
一直传递到主函数,然后停止程序并报出异常信息。
提示:
在开发中,可以在主函数中增加异常捕获而在主函数中调用其它函数,只要出现异常,
都会传递到主函数的异常捕获中这样就不需要在代码中,增加大量的异常捕获,能够保
证代码的简洁
总结:
try嵌套:如果try嵌套,那么如果里面的try没有捕获到这个异常,那么外面的try会接收到
这个异常,然后进行处理,如果外边的try依然没有捕获到,那么再进行传递。。 。
函数嵌套:
如果一个异常是在一个函数中产生的,例如函数A---->函数B---->函数c,而异常是在函数
c中产生的,那么如果函数c中没有对这个异常进行处理,那么这个异常会传递到函数B
中,如果函数B有异常处理那么就会按照函数B的处理方式进行执行﹔如果函数B也没有
异常处理,那么这个异常会继续传递,以此类推。。。如果所有的函数都没有处理,那么
此时就会进行异常的默认处理。
2、自定义异常
在python中,如果需要,只需继承Python内置异常类Exception,就可以实现
自定义异常类。自定义异常类的命名规则一般以Error或Exception为后缀。
关键点:
自定义异常类要继承Exception
类名(参数)就是定义一个类的实例对象raise对象名,即手动抛出这个异常
如果自己编写的某个模块需要抛出多个不同但相关的异常,可以先创建一个基类,然后
创建多个派生类分别表示不同的异常。
(四)总结
1、总结重点:
(1)异常的种类;
(2)异常处理机制