在自动化流程设计的过程中
异常处理是非常重要的一个环节
关系着自动化流程设计的健壮性
以及整个流程在运行中的稳定性
今天就介绍下
python中异常的基础知识
1.异常简介
异常是一个事件,该事件会在程序执行过程中发生,影响了程序的正常执行。一般情况下,在 Python 无法正常处理程序时就会发生一个异常。异常是 Python 对象,表示一个错误。当 Python 脚本发生异常时我们需要捕获处理它,否则程序会终止执行
造成异常的原因:1. 程序编写有问题造成,产生 Bug ,必须处理 2. 用户输入造成的 3. 无法预料的异常:磁盘已满、断网等
Python 的错误其实也是类 class,错误类型种类很多。而且所有的错误类型都继承自 BaseException
为什么要处理异常?为了使程序遇到问题时不让程序结束,而越过错误继续向下执行。Python 内置了一套异常处理机制,来帮助我们进行错误处理
处理异常:try except finally 作用:try 语句块用来检测程序中的错误,从而让 except 语句捕获错误信息并处理。执行完 except 后,如果有 finally 语句块,则执行 finally 语句块,至此,执行完毕。
2.基础知识
报出对应的异常
try:
print(3 / 0)
except ZeroDivisionError as e:
print("除数为零了")
except NameError as e:
print("变量未定义")
else: # 注意:else语句可有可无
print("代码没有问题")
print("程序继续执行")
try:
print(4 / 0)
except: # 使用 except 捕获常规错误,而不使用任何的错误类型
print("程序出现了错误")
使用 except 带着多种异常,匹配到其中一种即报错
try:
print(5 / 0)
except(NameError, ZeroDivisionError):
print("出现了 ZeroDivisionError 或 NameError")
特殊情况
"""
特殊:
1.错误其实是 class(类),所有的错误都继承自 BaseException,所以在
捕获的时候,它不仅捕获了该类型的错误,还把子类一网打尽
"""
try:
print(5 / 0)
except BaseException as e:
print("出现了BaseException")
except ZeroDivisionError as e:# 不会被执行
print("除数为零了")
"""
2.跨越多层调用,main 调用了 func2 ,2 调用了 1 ,
1 出现了错误,但是只要main捕获到了就可以处理
"""
def func1(num):
print(1 / num)
def func2(num):
func1(num)
def main():
func2(0)
try:
main()
except ZeroDivisionError as e:
print("调用的函数出现了错误")
Try、Except
try:
print(1 / 0)
except ZeroDivisionError as e:
print("除数为零了")
finally:
print("finally是一定会被执行的")
try:
print(1 / 0)
finally:
print("finally是一定会被执行的")
logging
import logging
logging.basicConfig(level=logging.DEBUG)
"""
logging 的好处:允许你指定记录信息的级别,有debug,info,warning,error4个级别,当我们指定 level=logging.INFO 时,logging.DEBUG 就不起作用了。级别高的覆盖级别低的,所以可以输出不同级别的信息,也不用删除,最后统一控制输出各个级别的信息。logging的另一个好处是通过简单的配置,一条语句可以同时输出到不同的地方,比如console和文件
"""
def div(a, b):
logging.info(b)
print(a / b)
div(10, 0)
3.结合可视化组件
比较普遍的一种情况是这样的: 当运行时如果有些偶发性的弹窗, 怎么保证关闭它并且不会影响流程的继续进行呢?
方案: 在可能出现这种情形的组件前面加上一个 try 来防止偶发中断流程.
范例 (如: 在打开 excel 的时候, 偶尔会弹出是否保存或是是否更新之类的提示, 便可以采用 try 来防止影响流程):
我们在点击或是别的操作或许因为网速或是其他原因会导致操作失败, 这时我通常会采用 try+while 来解决此类问题. 先设置一个变量, 给它一个值 (代表你想要点击出错后重新尝试的最大次数), 然后用 while 来判断是否尝试, 再用 try 去包裹这不太稳定的步骤, 如果一次就通过, 便 break 中断, 如果失败, 变更变量值 (我采取的是代码块, 就一句 count-=1 就行, 图中采用设置变量方便查看, 但貌似设置变量不太稳定, 故不推荐), 再次循环, 直到成功或者超出最大限制次数, 便结束操作.
在我们运行异常想了解报错信息的时候,try 的作用就更大了, 你可以直接使用消息框查看原始的报错信息, 也可以自己定义报错信息方便后续问题处理或是反馈客户。
同时捕获异常之后,在异常流程里可以加个截图组件,看看能不能保留到当时出错的界面,在后续分析时可以将这类原来未知的异常加入到已知异常的处理当中去,提升流程健壮性
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。