1 异常解决的关键:定位
a=3/0
结果为
C:\anaconda\python.exe D:/PycharmProjects/student/mypy06.py
Traceback (most recent call last):
File "D:/PycharmProjects/student/mypy06.py", line 9, in <module>
a=3/0
ZeroDivisionError: division by zero
Process finished with exit code 1
该异常的第一句C:\anaconda\python.exe 为解释器的位置
第二句为D:/PycharmProjects/student/mypy06.py,是哪个项目的哪个文件出错.
第三句,Traceback (most recent call last):溯源最后一次调用,可以看到是哪一句出现问题.
第四句,ZeroDivisionError: division by zero,为具体异常类型.
一般解决步骤为查找第四句,寻找解决的方法.
2 try-except语句块
try:
(可能发生异常的语句块)
except:
(发生异常时的处理方法)
try:
print('step0')
a=3/0
print(('step1'))
except BaseException as e :
print('step2')
print(e)
print(type(e))
结果为
step0
step2
division by zero
<class 'ZeroDivisionError'>
可以看出step1被跳过.
while True:
try:
x=int(input('请输入一个数字(输入88结束程序):'))
print('输入的数字为:',x)
if x==88:
print('输入结束')
break
except:
print('发生异常,请输入一个数字')
print('程序运行结束')
结果如下:
请输入一个数字(输入88结束程序):23
输入的数字为: 23
请输入一个数字(输入88结束程序):aaaa
发生异常,请输入一个数字
请输入一个数字(输入88结束程序):23231
输入的数字为: 23231
请输入一个数字(输入88结束程序):adsads
发生异常,请输入一个数字
请输入一个数字(输入88结束程序):88
输入的数字为: 88
输入结束
程序运行结束
3 一个try_多个except
在except中,子类在父类前,父类一般作为兜底使用.
try:
x=input("请输入一个被除数:")
y=input("请输入一个除数:")
z=float(x)//float(y)
except ZeroDivisionError:
print('0不能做除数')
except ValueError:
print('输入的不是两个数字')
except NameError:
print('变量不存在')
except BaseException as e:
print(e)
结果为:
请输入一个被除数:1
请输入一个除数:aa
输入的不是两个数字
可以看出BaseException放在最后.
4 try _except_else
有异常执行except后的语句块
没有异常则执行else后的语句块.
5 try_except_finally语句
finally后的语句块无论发生异常与否都会被执行.
try:
x=input("请输入一个被除数:")
y=input("请输入一个除数:")
z=float(x)/float(y)
except BaseException as e:
print(e)
else:
print(z)
finally:
print('无论如何都执行')
结果如下:
请输入一个被除数:1
请输入一个除数:0
float division by zero
无论如何都执行
6 注意return语句不要放在try,except,else或者finally中,一般放在程序最后
7 with 上下文管理
with 要执行操作 as 名称:
语句块
在执行完with语句块之后,打开的资源会自动关闭,释放资源.
不需要再通过finally语句释放资源.
with open("d:/PyCharm.txt",'r',encoding='UTF-8')as f:
content=f.readlines()
print(content)
['121324352\n', '李恒宇\n', '嘟嘟嘟']
8 自定义异常
#自定义异常
class AgeError(Exception):
def __init__(self,errorInfo):
Exception.__init__(self)
self.errorInfo=errorInfo
def __str__(self):
return (str(self.errorInfo)+'年龄异常,请输入1-150')#注意这里是return
##########测试代码#########
if __name__=="__main__":#如果为True,则文件作为独立文件运行,可以执行测试代码
age=int(input("请输入一个年龄:"))
if age<1 or age>150:
raise AgeError(age)
else:
print(age,'是正常的年龄')
结果为
请输入一个年龄:200
Traceback (most recent call last):
File "D:/PycharmProjects/student/mypy06.py", line 76, in <module>
raise AgeError(age)
__main__.AgeError: 200年龄异常,请输入1-150
9 pycharm开发环境调试
核心为设置断点.
用debug模式进入调试模式.
在方框中输入变量名,可以观察变量的变化情况.