1.导引问题
异常:Exception
需要考虑的例外情况复杂,对程序员本身要求高,不适合于解决问题。
python的异常机制,使我们可以关注于核心代码:
异常机制的本质:程序出现问题时,依然可以正确的执行剩余程序,而不是因异常而终止程序执行。
下图的红圈为异常的重点内容
Python中一切都是对象,异常也采用对象的方式来处理。
1.抛出异常:导演发生时,该方法生成代表该异常的一个对象,停止当前执行路径,并把异常对象提交给解释器。
2.捕获异常:解释器得到该异常后,寻找相应的代码来处理该异常。
2.try...一个except结构
没有执行 到异常情况,就跳过except;有问题了,就进入异常情况。
此处BaseException是指所有的异常情况,并且异常情况可以转为一个对象赋值给e。BaseException,BaseException as e为一个可选择的语句,可以有,也可以没有,看实际 情况。
while True:
try:
x=int(input('请输入一个数字:'))
print('输入的数字是:')
if x==88:
print('退出程序~')
break
except BaseException as a:
print('异常,输入的不是一个数字')
print(a)
3.try...多个except结构
ExceptionN要不是互斥,要不就是按先子后父类的关系(否则子类在后面就没意义了,父类已经执行完了)。
try:
a=input('输入被除数:')
b=input('输入除数:')
c=float(a)/float(b)
print(c)
except ZeroDivisionError:
print('除数不能是0')
except ValueError:
print('除数和被除数都应该为数值类型')
except NameError:
print('变量不存在')
except BaseException as e:#为了不报错,起的兜底的作用
print(e)
print(type(e))
结果:
输入被除数:a
输入除数:1
除数和被除数都应该为数值类型
4.try...except...else结构
try:
a=input('输入被除数:')
b=input('输入除数:')
c=float(a)/float(b)
print(c)#出现异常时,这一句会被跳过
except BaseException as e:
print(e)
print(type(e))
else:
print('除的结果是:',c)
结果:
输入被除数:10
输入除数:5
2.0
除的结果是: 2.0
可以通过此图看某一对象的级别关系
5.try...except...finally结构
try:
f=open('d:/addd.txt','r')
content=f.readline()
except :
print('文件未找到')
else:
print(content)
finally:
print('run in finally,关闭资源')
try: #如果没有try,会导致f.close()再次报错,按先后执行的顺序决定的
f.close()
except BaseException as e:
print(e)
print('执行程序结束')
结果:
文件未找到
run in finally,关闭资源
name 'f' is not defined
执行程序结束
finally,不管怎么样,都要执行finally后面的语句块,一般用于释放try占用的资源。
在finally中,如果没有try,会导致f.close()再次报错,按先后执行的顺序决定的
6.return语句和异常处理问题
return只放到方法最后
7.常见异常的解决
常用的异常汇总:
7.with上下文管理
with可以管理资源,使用完之后,可以释放占用的资源。
不是用来取代try...except...finally结构,而是作为补充,方便文件管理时的开发
8.trackback模块
追溯
两种用法:
第一种,反映在代码执行结果上
import traceback
try:
print('step1')
num=1/0
except:
traceback.print_exc()#追溯错误的来源,并打印出来
结果:
step1
Traceback (most recent call last):
File "C:\Program Files\JetBrains\PyCharm 2021.1.1\jbr\bin\Pycharm项目\mypro_exception\mypy_05.py", line 4, in <module>
num=1/0
ZeroDivisionError: division by zero
Process finished with exit code 0
说明:相比程序报错不能执行,step1是可以正常打印的,最后的Process finished with exit code 0说明程序是正常运行完的。(如果是1,则是不正常运行)
第二种:使用traceback将异常写入日志文件
import traceback
try:
print('step1')
num=1/0
except:
with open('d:/a.log','a') as f: #'a'是在后面添加的意思,open是有就打开,没有就新建
traceback.print_exc(file=f)
#'a'是在后面添加的意思,open是有就打开,没有就新建。
通过这种方式,将异常加入进文本,用于一段时间后的检查。
关于 if __name__=='__main__'
固定的搭配,是一个主程序的入口。如果不是主程序,那一个语句块就不会执行
如引用的.py
9.自定义异常类