1.异常捕获处理
-
异常:终止程序而现实的错误信息
-
基本格式:
try 将不能确定是否能正常执行的代码放入
except 出现异常错误执行except中语句 并执行 try之后的代码
(except Exception 未知错误)
else 如果try中的语句 没有错误执行 else;若try出错 不执行else
finally 无论try中语句是否有错误,都会执行finally
try :
num=int(input("请输入一个数字:"))
res=2/num
except ValueError:
print("输入类型错误!请输入一个正确的数字!")
except ZeroDivisionError:
print("0不能做被除数,请重新输入一个正确的数字!")
except Exception as f:
print("Error!",f)
else:
print(res)
finally:
print("ending~~~")
2.多个函数嵌套调用时,异常处理
- 函数多层嵌套时,函数错误会一层一层的往上寻找,最终找到主函数中去;故将try写到主函数位置
def demo1():
try:
return int(input('请输入正确的整数:'))
except Exception as r:
print('未知错误 %s' %r)
def demo2():
return demo1()
print(demo2())
3.主动抛出异常
-
当python解释器无法判断需求异常时,自动设置异常,将其抛出,供以使用,不会终止程序。
-
创建异常对象:
ex=Exception('...')
-
主动抛出异常:
raise ex
-
捕获异常:
try
注意: 抛出后需要捕获 如不捕获会出错
def input_passwd():
# 1.提示用户输入密码
pwd = input('请输入密码:')
# 2.判断密码的长度
if len(pwd) >=8:
return pwd
# 3.如果<8就主动抛出异常
print('主动抛出异常')
# a.创建异常对象
ex = Exception('密码长度不够,必须大于8位')
# b.主动抛出
raise ex
try:
print(input_passwd())
except Exception as re:
print(re)
4.断言
- assert 提前预言 提前知道错误的原因,会终止程序。
def func(num,div):
assert (div !=0),'div不能为0'
return num/div
print(func(10,0))
print('%%%')
5.异常与断言的区别
- 异常被捕获后可以不做处理,程序从捕获位置继续执行,断言是无法忽略的,程序在断言失败处立即终止因此断言通常用于调试版本,用来发现程序中的逻辑错误。虽然异常也能起到这样的作用,但是不应该用异常代替断言:
- 如果发现了逻辑错误,必须修改程序,而不可能在程序中进行处理和恢复,所以不需要 向外传送信息,没有必要使用异常;
- 使用断言的开销比异常小得多,而且断言可以从发布版中完全去除。
- 异常用于处理正确程序中的运行期问题(比如内存分配失败,窗口创建失败,线程创建失败,打开文件失败),以尽可能恢复,而不是终止程序。对于运行异常,使用断言是非常不合适的,理由很显然:
- 断言在发布版不起作用;
- 断言的处理方式不够友好;
- 运行异常不是程序错误,没有必要报告源代码出错位置。
【转载链接】