语法错误及异常的认识
#语法错误和异常
#1.语法错误:编译时错误
# while True
# print('----')
# number = 100
# def func():
# number+=1
#2.异常:运行时错误
# def chu(a,b):
# return a/b
# chu(4,0)ZeroDivisionError: division by zero
# print('-----一旦出现异常且没有处理下面就不执行了-----')
#异常处理
'''
try:
可能出现异常的代码
except:
匹配异常类型并作相应处理
finally:
无论是否存在异常都会被执行的代码
'''
def func():
try:
n1=int(input('输入第一个数字:'))
n2=int(input('输入第二个数字'))
sum=n1+n2
print('和是:',sum)
except:
print('必须是数字')
func()
print('--------')
'''
输入第一个数字:3
输入第二个数字a
必须是数字
--------
'''
异常匹配
def func():
try:
n1 = int(input('输入第一个数字:'))
n2 = int(input('输入第二个数字'))
per = input('请输入运算符(+,-,*,/)')
result=0
if per=='+':
result=n1+n2
elif per=='-':
result=n1-n2
elif per=='*':
result=n1*n2
elif per=='/':
result==n1/n2
else:
print('符号输入有误')
return
print('结果是',result)
except ZeroDivisionError:
print('除数不能为0')
except ValueError:
print('必须输入数字')
except Exception :
print('出错啦')
func()
'''
输入第一个数字:2
输入第二个数字0
请输入运算符(+,-,*,/)/
除数不能为0
'''
'''
输入第一个数字:3
输入第二个数字a
必须输入数字
'''
#这里引入一张异常类的继承图,然后说明由于异常匹配是按定义顺序匹配的,
# 因此异常类型比较大的应该放在最后去匹配,否则每次都只能匹配到大的,不能匹配到具体的
def func2():
try:
n1 = int(input('输入第一个数字:'))
n2 = int(input('输入第二个数字'))
per = input('请输入运算符(+,-,*,/)')
result=0
if per=='+':
result=n1+n2
elif per=='-':
result=n1-n2
elif per=='*':
result=n1*n2
elif per=='/':
result==n1/n2
else:
print('符号输入有误')
return
print('结果是',result)
except Exception:
print('出错啦')
except ZeroDivisionError:
print('除数不能为0')
except ValueError:
print('必须输入数字')
func2()
'''
输入第一个数字:3
输入第二个数字0
请输入运算符(+,-,*,/)/
出错啦
'''
'''
情况1:
try:
有可能会产生多种异常
except 异常类型1:
pass
except 异常类型2:
pass
如果是多个except,异常类型的顺序需要注意,最大的Exception要放到最后
情况2:获取Exception错误原因
try:
有可能会产生多种异常
except 异常类型1:
pass
except 异常类型2:
pass
except Exception as err:
print(err)
'''
#当匹配到最大的Exception时,仍想指定具体错误原因
def func():
try:
n1 = int(input('输入第一个数字:'))
n2 = int(input('输入第二个数字'))
per = input('请输入运算符(+,-,*,/)')
result=0
if per=='+':
result=n1+n2
elif per=='-':
result=n1-n2
elif per=='*':
result=n1*n2
elif per=='/':
result==n1/n2
else:
print('符号输入有误')
return
print('结果是',result)
# 文件操作,将计算结果保存到文件,如果写时文件不存在则自动创建,读时不存在则保存
# with open(r'd:\p1\aa2.txt','w') as stream:
# stream.write('本次运算结果是{}'.format(result))
with open(r'd:\p1\aa2.txt', 'r') as stream:
print(stream.read())
except ZeroDivisionError:
print('除数不能为0')
except ValueError:
print('必须输入数字')
except Exception as err:
print('出错啦',err)
func()
'''
输入第一个数字:3
输入第二个数字3
请输入运算符(+,-,*,/)*
结果是 9
出错啦 [Errno 2] No such file or directory: 'd:\\p1\\aa2.txt'
'''
try…except…else&try…except…finally
#try..except..else
#try..except..finally
'''
try:
code #需要判断是否会抛出异常的代码,如果没有异常处理,python会直接停止执行程序
except: #这里会捕捉到上面代码中的异常,并根据异常抛出异常处理信息
#except ExceptionName,args: #同时也可以接受异常名称和参数,针对不同形式的异常做处理
code #这里执行异常处理的相关代码,打印输出等
else: #如果没有异常则执行else
code #try部分被正常执行后执行的代码
finally:
code #退出try语句块总会执行的程序
'''
'''
1.这里的 else 是和 try except 连用的,并且 else 只在 try 中代码没有异常的情况下执行,else 必须在 except 这句代码存在的时候才能出现。
2.finally这个片段里面的代码是肯定在最后执行的,无论前面是否发生异常,最后总会执行finally片段内的代码。
所以,正常的流程是:try没有发生错误 =》else内的代码 =》finally中的代码。
发生异常的流程是:try中发生异常 =》被except捕获并执行except片段中的代码 =》执行finally中的代码。
也就是捕获到try的异常就执行except但是不执行else--finally
没有异常就执行else--finally
'''
def divide(a,b):
return a/b
##1.通过try-except捕获异常
try:
divide(1, 0)
except:
print("divide by 0")
else:
print("the code is no problem")
finally:
print("finally, hello world!")
'''
divide by 0
finally, hello world!
程序出现异常,被except捕获到,else不会执行,finally始终执行
'''
##2.else只在没有异常的时候执行
try:
divide(1, 1)
except:
print("divide by 0")
else:
print("the code is no problem")
finally:
print("finally, hello world!")
'''
the code is no problem
finally, hello world!
'''
'''
异常情况3:
try:
有可能有异常的代码
except 类型1:
pass
else:
如果try中没有发生异常则进入这里
'''
def func():
try:
n1=int(input('输入数字:'))
print(n1)
except ValueError:
print('必须是数字..')
else:
print('数字输入完毕')
func()
print('------------------------------------')
def func():
try:
n1=int(input('输入数字:'))
print(n1)
return 1
except ValueError:
print('必须是数字..')
return 2
else:
print('数字输入完毕')
func()
'''
没有异常会到else,但是如果在到else前遇到return就会被拦截
输入数字:2
2
数字输入完毕
------------------------------------
输入数字:2
2
'''
'''
输入数字:a
必须是数字..
------------------------------------
输入数字:a
必须是数字..
'''
#总结:如果使用else则在try代码中不能出现return
#异常情况4
'''
#文件操作
try :
pass
except:
pass
finally:
pass
#无论有没有异常都会执行finally
'''
def func():
stream=None
try:
stream = open(r'd:\p1\a.txt')
container=stream.read()
print(container)
return 1
except Exception as err:
print(err)
return 2
finally:
print('finally------------')
if stream:#不为空则关闭
stream.close()
return 3
x=func()
print(x)#现在我有这个文件,打印结果是3,代表前面即使return了依旧会进入fianlly
#因此无论是否异常,是否return都会进入finaly
#如果现在文件不存在,保存,依旧打印3
主动抛异常
#主动扔出异常
#注册 用户名必须6位
# def register():
# username=input('输入用户名:')
# if len(username)<6:
# raise Exception('用户长度必须6位以上')#抛出错误的提示信息
# else:
# print('输入的用户名是:',username)
#
# register()
'''
输入用户名:admin
Traceback (most recent call last):
File "D:/pythonFile/hanshu/excepttt6/func07.py", line 11, in <module>
register()
File "D:/pythonFile/hanshu/excepttt6/func07.py", line 7, in register
raise Exception('用户长度必须6位以上')#抛出错误的提示信息
Exception: 用户长度必须6位以上
'''
def register():
username=input('输入用户名:')
if len(username)<6:
raise Exception('用户长度必须6位以上')#抛出错误的提示信息
else:
print('输入的用户名是:',username)
try:
register()
except Exception as err:#err是用户长度必须6位以上
print(err)
print('注册失败')
else:
print('注册成功')
'''
输入用户名:dd
用户长度必须6位以上
注册失败
'''