###异常###:
-
程序在运行的时候,如果python解释器遇到一个错误,会停止程序的执行,并且提示一些错误的信息,这就是异常
-
可能出现的通常由于用输入或操作异常引起的,我们在程序开发的时候,很难将所有的特殊情况都处理。通过异常捕获可以针对突发事件做集中处理,从而保证程序的健壮性和稳定性
-
在程序开发中,如果对某些代码的执行不能确定(程序语法完全正确)可以增加try来捕获异常
2.捕获异常的格式
try这个关键字来捕获异常
try:
<尝试执行的代码>
except<错误类型1>:
<针对出现错误1,处理的代码>
except<错误类型2>:
<针对出现错误2,处理的代码>
except Exception as <变量>
<针对不可知异常类型的处理代码>
else:
<当没有出现上述异常会执行的代码,出现异常不会执行>
finally:
< 无论是否出现异常都会执行的代码>
“”"
需求:
1.提示用户输入一个整数
2.使用8来除以用户输入的整数
可能出现的异常类型:
1.输入的数据类型异常
2.输入的除数为0 (除数不能为0)
try:
num = int(input('请输入一个除数:'))
result = 8/num
except ValueError:
print('输入的值不是合法的整数')
except ZeroDivisionError:
print('0不能作为除数')
except Exception as r:
print('未知错误%s' %(r))
finally: #无论是否异常都会执行的
print('####')
运行结果: #不论运行出现哪种异常,代码都会顺利执行完成不出现报错
请输入一个除数:3.2
输入的值不是合法的整数
####
请输入一个除数:0
0不能作为除数
####
##异常的传递性##
在代码执行过程中,一旦出现异常就会一级一级的传递异常,最终到造成异常出现的地方,如果是调用函数造成的最终会在函数的定义中报异常
def demo1(): #定义函数1
return int(input('请输入整数:'))
def demo2(): #定义函数2
return demo1() #调用第一个函数
print(demo2()) #打印第二个函数,还是函数一的值
运行结果:
请输入整数:2.3 #输入的值不合法,就会一层层传递往上寻找
Traceback (most recent call last):
File "/home/kiosk/PycharmProjects/20190523/20190524/作业练习.py", line 127, in <module>
print(demo2())
File "/home/kiosk/PycharmProjects/20190523/20190524/作业练习.py", line 120, in demo2
return demo1()
File "/home/kiosk/PycharmProjects/20190523/20190524/作业练习.py", line 117, in demo1
return int(input('请输入整数:'))
ValueError: invalid literal for int() with base 10: '2.3'
请输入整数:2
2
该类异常的出现可以直接在函数定义的时候进行异常捕获处理,这样其他的代码再次调用该函数的时候就不会报错
def number():
try:
a = int(input('请输入一个数:'))
except ValueError:
print('输入的值不合法,请重新输入')
else:
return a
def func(x):
try:
result = 10/x
except ZeroDivisionError:
print('0不能作为除数')
except Exception as e:
print('未知错误%s' %(e))
else:
return result
print(func(number()))
##主动抛出异常##
在脚本中为了保证达到一定的条件,可以将没有达到条件的情况设置为异常并且主动抛出,到异常被抛出但没有捕获异常处理时就会出现程序报错且终止运行
ex = Exception(异常类型) #.创建异常对象并且定义一个变量接受
raise ex #主动抛出异常
需求:提示用户输入密码 如果长度小于8 就抛出异常
def input_passwd():
# 1.提示用户输入密码
pwd = input('请输入密码:')
# 2.判断密码的长度
if len(pwd) >=8:
return pwd
# 3.如果<8就主动抛出异常
print('主动抛出异常')
#a.创建异常对象
ex = Exception('密码长度不够')
#b.主动抛出
raise ex
# 注意:只抛出异常而不捕获异常 代码会出错
try:
print(input_passwd())
except Exception as re:
print(re)
需求:计算10以内的两个数的加法,输入的数如果大于10生成异常且主动抛出
def num():
try:
num1 = int(input('请输入一个数:'))
num2 = int(input('请输入一个数:'))
except ValueError:
print('输入的值不合法')
else:
if num1<10 and num2<10:
return num1 + num2
ex = Exception('输入的数大于10')
raise ex
try:
print(num())
except Exception as n:
print('输入错误')
###断言###
断言:可以理解为提前预言 让人更好的知道错误的原因
格式:
assert(条件) ‘异常的类型’
就是提前规定的条件必须满足,一但不满足这个条件就会出现异常,并指出了异常类型
def func(num,div):
assert (div !=0),'div不能为0'
return num/div
print(func(10,0))
运行:
Traceback (most recent call last):
File "/home/kiosk/PycharmProjects/20190523/20190524/作业练习.py", line 153, in <module>
print(func(10,0))
File "/home/kiosk/PycharmProjects/20190523/20190524/作业练习.py", line 150, in func
assert (div !=0),'div不能为0'
AssertionError: div不能为0 #出现异常,并且是指前指定的类型