文章目录
前言
“花圃记录学习日常”。刚开始走上Python之路,以下都是入门基础内容的一些要点笔记。
一、导引
我们可以设想一下,如果在一条公路上我们在行驶过程中遇到阻挡继续前进的石头,我们实际上是希望我可以绕过石头继续正常前进的,而不是遇到了石头就停下来,后边的路先不管了。
1.异常机制本质
异常:指的是程序运行过程中出现了非正常的现象(Exception)。
异常处理:出现问题依然可以正常执行剩余的程序,不会因为异常而终止程序的执行。
2.异常的处理过程
抛出异常:再执行一个方法的时候,如果发生异常,则这个方法生成代表该异常的一个对象,停止当前执行的路径,并把该异常对象交给解释器。
捕获异常:解释器得到该异常对象之后,寻找相应的代码去处理该异常。
二、try—except结构
1.try…一个except结构
try…except结构是最常见的异常处理结构。
try:
被监控的可能会引起异常的语句块
except BaseException as e:
异常处理的语句块
那么执行的原则是这样的,如果try部分的程序没有出现任何异常,那么程序会跑完try部分的代码,而不执行(跳过)except部分的代码。如果try部分出现了异常,那么从异常开始的语句往后的部分都不在去执行,直接跳到except部分去执行其中的语句。
整个try…except模块结构执行完跳出来,继续执行下边的程序。
try:
print("执行step1")
a=3/2
print(a)
print("执行step2")
except BaseException as e: #这里是说把BaseException对象赋给e变量,方便后边调用
print("执行step3")
b=4/2
print(b)
print("执行step4")
print("try部分的异常是{}".format(e))
print("try部分的异常type是{}".format(type(e)))
pass
print("跳出try…except结构")
输出结果:
执行step1
1.5
执行step2
跳出try…except结构
try:
print("执行step1")
a=3/0
print(a)
print("执行step2")
except BaseException as e: #这里是说把BaseException对象赋给e变量,方便后边调用
print("执行step3")
b=4/2
print(b)
print("执行step4")
print("try部分的异常是{}".format(e))
print("try部分的异常type是{}".format(type(e)))
pass
print("跳出try…except结构")
输出结果:
执行step1
执行step3
2.0
执行step4
try部分的异常是division by zero
try部分的异常type是<class 'ZeroDivisionError'>
跳出try…except结构
2.示例
正常循环如下,但有一个问题就是,在用户端输入的如果不是数字,那么我就会直接报错停止我的程序,这是我们不希望的,我们希望是处理提示错误,并且重新开启下一次输入的循环。
while True:
x=int(input("请输入一个数字:"))
print(x)
if x==88:
print("退出循环")
break
pass
pass
print("循环已经退出")
输出结果:
请输入一个数字:12
12
请输入一个数字:aa
Traceback (most recent call last):
File "D:/Python/mypy01/04.py", line 54, in <module>
x=int(input("请输入一个数字:"))
ValueError: invalid literal for int() with base 10: 'aa'
加入try-except:
while True:
try:
x=int(input("请输入一个数字:"))
print(x)
if x==88:
print("退出循环")
break
pass
except BaseException as e:
print("异常,您输入的不是数字")
print(e)
pass
pass
print("循环已经退出")
输出结果:
请输入一个数字:11
11
请输入一个数字:aa
异常,您输入的不是数字
invalid literal for int() with base 10: 'aa'
请输入一个数字:88
88
退出循环
循环已经退出
3.try…多个except结构
try…except结构是最常见的异常处理结构。
try:
被监控的可能会引起异常的语句块
except ValueError:
语句块
……
except BaseException as e:
异常处理的语句块
while True:
try:
x=float(input("请输入一个数字:"))
y=float(input("请输入一个数字:"))
print(x/y)
if x/y==1:
print("退出循环")
break
pass
except ZeroDivisionError:
print("除数y不能为0")
pass
except ValueError:
print("输入x/y应该是数字,不能是字符串")
except BaseException as e:
print("其他异常")
print(e)
pass
pass
print("循环已经退出")
输出结果:
请输入一个数字:1
请输入一个数字:a
输入x/y应该是数字,不能是字符串
请输入一个数字:1
请输入一个数字:0
除数y不能为0
请输入一个数字:1
请输入一个数字:1
1.0
退出循环
循环已经退出
4.try…except…else结构
执行顺序也很简单,try没有异常紧接着执行else这个模块,再去跳出整体结构执行下面程序,如果有异常那就执行except模块,在跳出整体的结构,执行下面的程序。
5.try…except…(else…)finally结构
try没有异常紧接着执行else这个模块,执行finally模块,再去跳出整体结构执行下面程序,如果有异常那就执行except模块,执行finally模块,在跳出整体的结构,执行下面的程序。【在申请关闭资源的时候finally结构好用,处理IO流打开文件】
try:
f=open("C:/Users/(此处略去我的信息)/Desktop/Stu.Learning/finally.txt","r")
content=f.readline()
print("文件内容是{}".format(content))
pass
except BaseException as e :
print("未找到文件")
pass
finally:
try:
f.close()
print("关闭文件")
pass
except BaseException as e:
print(e)
pass
pass
print("结束!")
输出结果:
文件内容是123456
关闭文件
结束!
三、常见异常问题
首先return语句不要放到异常处理结构中。
SyntaxError:语法错误
NameError:尝试访问一个没有被定义的变量
ZeroDivisionError:除数不能为零
ValueError:数值错误
TypeError:类型错误
AttributeError:访问的对象没有……属性
IndexError:索引越界
KeyError:关键字不存在
………
………
四、with上下文管理
首先声明一点是,with不是去取代上面的try except finally结构的,只是起到补充的作用,在文件管理和网络传递的开发。
with 可以自动地关闭打开的资源。
with open("C:/Users/(此处略去我的信息)/Desktop/Stu.Learning/finally.txt","r") as f:
content=f.readline()
print("文件内容是{}".format(content))
pass
print("已经退出")
输出结果:
文件内容是123456
已经退出
五、traceback模块导入和打印异常日志
import traceback
try:
print("step1")
n=1/0
pass
except:
with open("C:/Users/(此处略去个人信息)/Desktop/Stu.Learning/finally.txt","a") as f:
traceback.print_exc(file=f)
pass
pass
输出结果:
step1
日志情况:
六、自定义异常类
class AgeError(Exception):
def __init__(self,errorInfo):
Exception.__init__(self)
self.errorInfo=errorInfo
pass
def __str__(self):
return str(self.errorInfo)+"年龄应该在1-150之间"
pass
if __name__=="__main__": #如果为True模块将作为独立文件执行
age=int(input("请输入您的年龄:"))
if age<0 or age>150:
raise AgeError(age) #如果满足if条件则抛出一个错误
else:
print("正常")
pass
pass
输出结果:
请输入您的年龄:200
Traceback (most recent call last):
File "D:/Python/mypy01/04.py", line 101, in <module>
raise AgeError(age) #如果满足if条件则抛出一个错误
__main__.AgeError: 200年龄应该在1-150之间