影刀RPA新手教程:try-catch-finally异常处理完整用法与常见误区
流程写了一百步,差一步报错就全崩。
实际运行环境里,网络波动、弹窗广告、验证码、页面加载超时——这些随时会发生。你不处理,流程就停。
影刀的try-catch-finally就是处理这些问题的。但很多人只知道"放进去就不报错了",实际上用错了比不处理更糟糕。
一、先区分两类异常
异常分为可控和不可控:
| 类型 | 例子 | 处理方式 |
|---|---|---|
| 可控异常 | 账号错误、文件路径不存在、数据格式不对 | 用if判断 |
| 不可控异常 | 网络断开、随机弹窗、验证码、页面改版 | 用try-catch |
简单记住:你能提前预判的用if,你预判不到的用try-catch。
二、try-catch-finally的执行流程
拼多多店群自动化报活动上架!
很多人以为Finally只在报错时执行——这是错的。
# try-catch-finally执行顺序Try:步骤A 步骤B# 如果这里报错,跳到Catch步骤C# 如果步骤B报错,步骤C不执行Catch:记录错误信息(即使Try里有终止指令,也会进入这里) Finally:关闭弹窗(一定会执行!不管Try成功还是Catch被触发)三个关键规则:
- Try里任意一步报错,剩余步骤全部跳过,立刻进入Catch
- Catch内可以记录错误、截图、发通知
- Finally一定会执行——即使你在Try里写了"终止应用",Finally也会跑
三、基础写法
Try:打开网页("https://seller.pinduoduo.com/")等待元素出现("登录按钮",5秒)点击元素("登录按钮")Catch:输出日志("登录流程出现异常")截图保存("D:\日志\错误截图_{当前时间}.png")Finally:关闭弹窗(如果有)输出日志("登录流程结束")四、常见误区
误区1:把所有代码都放进Try
# 错误:整个流程包在一个大Try里Try:打开网页 登录 采集数据 处理数据 保存文件 Catch:输出日志("出错了")# 问题:不知道哪里出错,排查困难正确做法:Try只包可能出错的核心步骤,分模块处理。
# 正确:分模块Try-CatchTry:打开网页 登录账号 Catch:输出日志("登录阶段异常,跳过当前账号")返回 Try:采集数据 Catch:输出日志("采集阶段异常,记录当前页")截图 Try:保存文件 Catch:输出日志("保存阶段异常,尝试备用路径")误区2:Catch里什么都不做,吞掉所有错误
# 错误:问题被隐藏了Try:点击元素("提交按钮")Catch:# 什么都不做!错误被吃了后果:流程没停,但数据也没提交成功。你永远不知道采集回来的数据是空的。
正确做法:
Try:点击元素("提交按钮")Catch:输出日志(f"提交失败:{错误信息}")发送飞书通知("提交失败,请检查")误区3:Finally 一定能执行,但执行时机不对
Finally一定会执行——即使Try里抛了异常。但如果你在系统层面强制结束了进程,Finally也救不了。
# 流程ATry:执行任务 Catch:终止应用# 命令1[video(video-jQebwvPo-1781074878749)(type-csdn)(url-https://live.csdn.net/v/embed/526817)(image-https://v-blog.csdnimg.cn/asset/1d3c3709da119dd8c13ab01e9b282520/cover/Cover0.jpg)(title-TEMU店群矩阵自动化运营核价报活动)]Finally:关闭文件# 命令2:会执行!先执行2再执行1五、Raise指令:主动抛出异常
Raise可以在代码任何位置主动抛异常,改变流程的执行方向。
# 场景:数据验证不通过,主动中止当前流程获取单元格值(订单表,当前行,3)->订单金额 如果 订单金额<0:输出日志("订单金额异常,跳过")Raise("订单金额为负数")# 主动抛异常,跳到Catch# Catch里统一处理Catch:输出日志(f"订单处理异常:{错误信息}")写入单元格(订单表,当前行,5,"处理失败")六、实战:批量采集中的异常处理
# 批量采集多页商品数据读取Excel("D:\商品列表.xlsx")->任务表 获取表格行数(任务表)->总行数 遍历行索引(1,总行数):商品名=获取单元格值(任务表,当前行,1)Try:尝试次数=0条件循环(尝试次数<3):尝试次数=尝试次数+1Try:输入文本("搜索框",商品名)点击元素("搜索按钮")等待元素出现("搜索结果列表",5秒)跳出循环# 搜索成功Catch:输出日志(f"第{尝试次数}次搜索失败")等待(2秒)采集搜索结果()Catch:输出日志(f"商品'{商品名}'处理失败,已重试3次")写入单元格(任务表,当前行,3,"失败")继续下一个# 跳到下一个商品,流程不停止七、易错速查
| 错误 | 后果 | 修正 |
|---|---|---|
| 整个流程包一个Try | 排查困难 | 按模块拆分Try |
| Catch里不输出日志 | 永远不知道有问题 | 至少输出日志 |
| 以为Finally只报错时执行 | 逻辑写错 | Finally必然执行 |
| Try里写终止指令以为Finally不执行 | 资源没释放 | Finally在终止前会跑 |
作者:林焱
本文为《影刀RPA学习手册》系列文章之一,内容源于实操经验的整理与分享。