影刀RPA异常处理实战:Try-Catch正确用法
影刀RPA异常处理实战Try-Catch正确用法作者林焱 | 难度⭐⭐⭐ | 预计阅读11分钟写在前面没有哪个RPA流程能永远不报错。网络会抖页面会改版弹窗会乱入元素会失效。如果不在流程里加入异常处理任何一个意外都会导致整个流程中断前面跑的数据全白费。这篇文章把Try-Catch讲透——什么时候用、怎么用、Finally块到底有什么用。一、RPA流程里会遇到哪些异常先搞清楚异常有哪些类型才能知道怎么处理。可控异常这类异常是可以提前预判的。比如账号或密码错误文件不存在Excel被其他程序占用某个必填参数没有传值可控异常的特点是你事先知道这种情况可能发生可以提前写逻辑判断。处理方式用If/Else判断提前拦截。不可控异常这类异常无法提前预判是运行时才出现的。比如网络突然断了页面上突然弹出一个广告弹窗元素突然找不到了网页改版服务器超时无响应不可控异常的特点是你不知道它什么时候会发生。处理方式用Try-Catch捕获防止流程崩溃。二、Try-Catch的基本结构Try-Catch是影刀RPA里处理异常的核心指令。基本结构Try 可能出错的指令... Catch 出错后要执行的逻辑... Finally 无论是否出错都会执行的清理逻辑... End Try三个块分别做什么拼多多店群自动化报活动上架Try块放可能出错的指令。比如打开网页、点击元素、读取文件……这些操作都有可能失败放在Try里。Catch块放出错后的处理逻辑。比如截图保存现场、写日志、发通知给管理员、给变量赋一个默认值……Finally块放无论如何都要执行的清理逻辑。比如关闭浏览器、关闭Excel、释放资源……关键即使Try块里执行了终止应用Finally块仍然会执行。三、Try-Catch实战案例案例1打开网页时处理超时网络不好的时候打开网页指令可能会超时或失败。Try 打开网页URLhttps://www.example.com超时10秒 [等待元素出现]元素页面加载完成标志超时5秒 Catch 打印日志打开网页失败原因 ${exception_message} 截图保存路径./logs/error_screenshot.png 发送钉钉通知内容流程异常打开网页失败 给变量 ${page_load_success} 赋值false Finally 如果${page_load_success} false 关闭网页 结束如果 End Try案例2采集数据时处理元素找不到采集列表数据时如果某一条数据的元素突然找不到了比如被删除或改版整个循环就会中断。用Try-Catch包裹每次采集操作可以保证一条失败不影响其他条。循环ForEachitem in ${product_list} Try 获取元素文本目标元素商品标题→ 保存到 ${title} 获取元素文本目标元素商品价格→ 保存到 ${price} 写入Excel行当前行列1${title}列2${price} Catch 打印日志采集第 ${index} 条数据失败跳过) 继续循环 ← 关键跳过当前条继续下一条 End Try 结束循环四、Try-Catch的常见误区误区1Catch块里什么都不写有些新手会把Catch块留空——什么逻辑都不写。这样做的结果是异常被吞掉了你根本不知道流程出了什么问题。正确做法至少在Catch块里写日志记录异常信息。Catch 打印日志异常信息 ${exception_message}) 截图保存路径./logs/error.png误区2Finally块里放业务逻辑Finally块的本来用途是清理资源关闭文件、关闭浏览器等。有些新手会在Finally里放业务逻辑比如写入Excel。这样做的问题是Finally无论如何都会执行——即使Try里已经正常完成了业务逻辑结果Finally里又执行了一遍导致重复。正确做法Finally里只放清理逻辑不放业务逻辑。误区3Try块里放太多指令Try块的粒度要合适——不要太大也不要太小。太大一出异常你不知道具体是哪条指令出的问题。太小到处都是Try-Catch流程看起来很乱。建议Try块里放一个完整的功能单元比如打开网页并等待加载完成这一个单元包在一个Try里。五、可控异常用If判断不要用Try-Catch前面说了异常分两类可控和不可控。可控异常应该用If判断来处理不要用Try-Catch。举例检查文件是否存在错误做法用Try-CatchTry 打开Excel文件路径${file_path} Catch 打印日志文件不存在 End Try正确做法用If判断If文件是否存在${file_path} true 打开Excel文件路径${file_path} Else 打印日志文件不存在请检查路径 ${file_path} 终止应用 End If原因文件是否存在是可以提前判断的不需要等到运行时才捕获异常。提前判断逻辑更清晰效率也更高。六、异常信息的获取在Catch块里你可以获取详细的异常信息帮助你定位问题。影刀RPA提供了以下内置变量在Catch块里自动可用变量含义${exception_message}异常的详细错误信息${exception_type}异常的类型如元素未找到、超时等${exception_stack}异常的调用栈高级用法实战把异常信息写到日志文件Catch 拼接字符串结果${error_log}内容[ 时间字符串现在 ] 异常类型 ${exception_type} 异常信息 ${exception_message} 写入文本文件文件路径./logs/error.log内容${error_log}追加模式七、多层Try-Catch异常向上抛出有时候子流程A调用了子流程B而异常发生在子流程B里。这时候有两种处理方式方式1在子流程B里处理异常子流程B自己用Try-Catch把异常处理掉子流程A完全不知道发生过异常。TEMU店群矩阵自动化运营核价报活动适用场景这个异常子流程B自己就能处理不需要告诉调用方。方式2在子流程B里不处理让异常抛给子流程A子流程B里不用Try-Catch让异常自然抛出。子流程A调用子流程B时用Try-Catch包裹在Catch里统一处理。适用场景这个异常需要调用方来决定怎么处理比如是重试、还是终止、还是通知管理员。代码示例子流程B被调用方不进行异常处理让异常抛出。子流程B采集商品标题 1. 获取元素文本目标元素商品标题→ 保存到 ${title} 2. 返回 ${title}子流程A调用方用Try-Catch包裹调用。Try 调用子流程采集商品标题输出${result_title} Catch 打印日志采集商品标题失败 ${exception_message}) 给 ${result_title} 赋值采集失败 Finally 清理逻辑 End Try八、实战一个健壮的数据采集流程把前面讲的所有异常处理技巧整合到一个完整的流程里。流程结构主流程 main ├── Try │ ├── 调用子流程初始化打开网页、校验登录状态 │ ├── 调用子流程采集数据循环采集每一条 │ └── 调用子流程保存数据写入Excel │ Catch │ ├── 截图保存现场 │ ├── 写错误日志 │ └── 发送通知 │ Finally │ ├── 关闭网页 │ ├── 关闭Excel │ └── 打印日志流程执行完成无论成功或失败 └── End Try关键点主流程只包一个大的Try-Catch保证任何未捕获的异常都不会导致流程无声崩溃。每个子流程内部也根据自己的需要加Try-Catch。比如采集数据子流程里每一条数据的采集都用Try-Catch包裹保证一条失败不影响其他条。Finally块里做清理确保无论成功还是失败资源都会被释放。九、常见异常速查表异常类型可能原因处理建议元素未找到元素失效、网页未加载完修复元素加等待时间用Try-Catch包裹超时网络慢、服务器响应慢增大超时时间设置加重试逻辑Excel被占用文件被其他程序打开在Finally块里确保关闭Excel运行前检查文件是否被占用权限不足没有操作目标文件的权限以管理员身份运行影刀RPA检查文件权限设置元素属性变化网页改版修复元素改用更稳定的定位方式如id十、结语异常处理的核心目标只有一个让流程在遇到意外时能够优雅地处理而不是直接崩溃。Try-Catch用好了你的流程会健壮很多。回头看最重要的一句可控异常用If判断不可控异常用Try-Catch。把这个原则记住异常处理就不会乱用了。下一篇讲数据采集实战把循环、Excel写入、异常处理整合到一个完整案例里。作者林焱 | 转载请注明出处

相关新闻