遇到异常,首先找度娘
Python中异常处理语句用try…excepy
print('step0')
try:
print('step2')
a=3/0 #发生异常,跳转到except下语句
print('step2') #上方异常,被跳过
except: #try里若无错误,则except不执行
print('发生异常')
print('end')
运行结果
step0
step2
发生异常
end
示例 循环输入数字,如果不是数字则异常处理。直到输入88
while True:
try:
x=int(input("请输入一个数字"))
print('输入的数字是',x)
if x==88:
print('退出程序')
break
except BaseException as e:
print(e)
print('输入的不是数字')
运行结果
请输入一个数字5
输入的数字是 5
请输入一个数字10
输入的数字是 10
请输入一个数字i
invalid literal for int() with base 10: 'i'
输入的不是数字
请输入一个数字88
输入的数字是 88
退出程序
一个try 可以对应多个except
但要注意,先放错误的子类,再放错误的父类
建议最后一个放 BaseException,以防止未知错误
测试try…多个except结构
try:
x1=input("请输入一个被除数")
x2=input("请输入一个除数")
c=float(x1)/float(x2)
except ZeroDivisionError:
print("错误,不能除以0")
except ValueError: #允许这个异常与上一异常没有父子关系
print("错误。不能将字符串转化成数字")
except NameError:
print("错误,变量不存在")
except BaseException: #来防止其他异常
print('其他异常')
运行结果
请输入一个被除数5
请输入一个除数0
错误,不能除以0
还可以使用try…except…else结构
如果try中没有抛出异常,则执行else,若出现异常执行except不执行else
try:
a=input('请输入被除数')
b=input('请输入除数')
c=float(a)/float(b)
except BaseException:
print("出现异常")
else:
print('结果为:',c)
print('程序结束')
运行结果
请输入被除数5
请输入除数1
结果为: 5.0
程序结束
最后还有try…except…finally结构
无论是否发生异常都会被执行,通常用来释放try块中申请的资源
try:
a1=input('请输入被除数')
b1=input('请输入除数')
c1=float(a1)/float(b1)
except BaseException:
print("出现异常")
else:
print('结果为:',c1)
finally:
print('finally语句,我都被执行')
print('程序结束')
运行结果
请输入被除数5
请输入除数1
结果为: 5.0
finally语句,我都被执行
程序结束
测试释放try块中申请的资源
try:
f=open("d:/a.txt","r") #读取文件
content =f.read()
print(content)
except:
print("文件未找到")
finally:
try:
f.close()
except BaseException as e:
print(e)
print("程序结束")
运行结果
文件未找到(这里我随便输入的文件名,因此不会找的文件)
name 'f' is not defined
程序结束
有时我们需要将异常信息输出到指定文件中这时使用traceback包内的print_exc用来打印异常信息
好处:让程序一直跑,人离开后能记录异常
try:
print('step1')
num=1/0
except:
traceback.print_exc()
#将异常信息输出到指定文件中
with open('d:/a.txt',"a") as f:
traceback.print_exc(file=f)
我们还可以自定义异常类
一般继承Exception或其子类即可,命名一般以Error、Exception为后缀
class AgeError(Exception): #继承Exception类
def __init__(self,errorInfo):
Exception.__init__(self)
self.errorInfo=errorInfo
def __str__(self):
return str(self.errorInfo)+',年龄错误,应在1-150之间'
###############测试代码##################
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 "E:/pycharm/Python 练习/异常处理4.py", line 17, in <module>
raise AgeError(age) #这里是我们自定义的错误类
__main__.AgeError: 200,年龄错误,应在1-150之间