流程跑着跑着突然崩了,弹出一个红色报错框——这是新手最怕的事。其实大部分崩溃都可以提前兜住,让流程继续跑,而不是直接死掉。
影刀提供了try-catch-finally机制,专门用来“试一下,不行就换个方式处理,最后无论如何都收个尾”。我也是用了半年才完全搞懂三个块的关系,这里把踩过的坑一次说清。
一、try-catch-finally 三块各司其职
在右侧指令面板搜索“异常捕获(Try-Catch) ”,拖入流程后会自动生成三个区块。
| 块 | 作用 | 是否必须 | 什么情况执行 |
|---|---|---|---|
| Try | 放可能出错的指令 | ✅ 必须 | 正常执行 |
| Catch | 出错后执行的补救代码 | 可选 | Try里任何指令报错时 |
| Finally | 无论对错都执行的收尾代码 | 可选 | Try或Catch执行完后 |
语法结构长这样:
Try:
# 可能报错的指令,比如点击一个可能不存在的按钮
Catch:
# 出错后记录日志、换另一种方式操作

Finally:
# 关闭弹窗、清理缓存等(不管成不成功都要做)
二、Try块:只放“可能失败”的指令
适合放Try的指令
- 点击元素:元素可能不存在
- 获取元素文本:元素可能加载慢
- 打开网页:网络可能超时
- 模拟输入:输入框可能被禁用
不适合放Try的指令
- 变量赋值(
变量 = 1不会失败) - 输出日志(不会失败)
- 循环控制(跳出循环等)
原则:只有可能产生异常的指令才放Try。放太多无关指令会让Catch块难以定位真正的问题。
实操:捕获一个可能不存在的弹窗
Try:
判断元素是否存在(关闭弹窗按钮) → 弹窗存在
如果 弹窗存在 == True:
鼠标点击(关闭弹窗按钮)
Catch:
输出日志("没有弹窗或关闭失败,继续")
注意:如果把“输出日志”也放Try里,它永远不会报错,但会浪费Catch的判断。
三、Catch块:出错后的“B计划”
当Try块里任何一条指令报错,程序会立刻跳转到Catch块,Try块剩余的指令不再执行。
Catch块应该做的事
- 记录错误信息:用“输出日志”或“获取上一个错误信息”指令
Catch:
错误信息 = 获取上一个错误信息()
输出日志("出错了:" + 错误信息)
# 比如输出:"出错了:元素'登录按钮'不存在"
- 执行备用方案:比如换成另一种点击方式
Try:
鼠标点击(登录按钮, 点击方式=前端点击)
Catch:
输出日志("前端点击失败,换模拟点击")
鼠标点击(登录按钮, 点击方式=模拟点击)
- 决定是否继续:用“继续”或“跳出循环”控制流程走向
四、Finally块:必须执行的收尾
Finally块里的内容无论Try块是否报错都会执行。适合放:
- 关闭弹窗
- 关闭浏览器标签页
- 保存当前进度到表格
- 释放资源(关闭文件、断开数据库连接)
一个常见的坑:如果在Try里新建了一个网页对象,想在Finally里关闭它,但Finally里找不到相应的对象。原因是Finally没法确定Try里面能不能执行到获取网页对象那一步。
解决方法:在Try前面先定义好这个变量。
# 先定义变量(赋个空值)
设置变量 $网页对象 = None
Try:
打开网页("https://xxx.com") → $网页对象
执行操作...
Catch:
输出日志("出错了")
Finally:
如果 $网页对象 != None:
关闭网页($网页对象)
五、异常处理的四个实战原则
原则1:捕小不捕大
❌ 错误做法:对整个程序进行异常捕获。在任意一个环节出错,流程就会被终止。
✅ 正确做法:针对容易出错的地方进行Try捕获:
- 在循环登录并导出账单的部分做一个捕获,出错了记录并切换到下一个账号
- 在合并Excel的部分做一个捕获
- 在上传FTP的部分做一个捕获
我的原则是:只对关键步骤加异常处理,比如数据写入、文件保存这些不可逆的操作。对于读取数据、页面跳转这些,只要“重试3次”就够了。
原则2:重试机制(不是无限重试)
设置 $重试次数 = 0
设置 $最大重试 = 3
Try:
点击元素("提交按钮")
Catch:
$重试次数 = $重试次数 + 1
如果 $重试次数 < $最大重试:
输出日志("第{$重试次数}次重试")
等待(2000)
# 重新执行Try里的操作
否则:
输出日志("重试{$最大重试}次仍失败,跳过")
调用子流程("发送告警")
原则3:结合错误截图保留现场
在Catch块里加“截图保存”指令:
Catch:
输出日志("出错了:" + 获取上一个错误信息())
截图保存(路径="C:\error\error_" + 当前时间 + ".png")
出错后不需要重现现场,直接翻截图就能看到是哪一步出了问题。
原则4:出错后发通知
Catch:
输出日志("采集失败,错误信息:{$error}")
截图保存()
调用子流程("Z01_发送企微通知",
消息内容="❌ 采集失败!错误:{$error}")
使用时一般配合Try-Catch:如果发生异常,应用并不会终止,而是执行Catch里的代码,并把报错信息保存到exception变量中。
六、影刀常见报错速查
报错1:元素定位失败/找不到元素
错误信息:元素定位失败,请检查XPath是否正确 或 Timeout waiting for element
原因:
- 页面还没加载完就去点
- XPath写错了或页面改版了
- 元素在iframe里没切换进去
- 元素被遮挡或不可见
解决方法:
- 在点击/获取元素前加“等待元素出现”(超时5-10秒)
- 用XPath Helper验证XPath是否能定位到唯一元素
- 检查元素是否在iframe里,先加“切换到iframe”
- 元素被遮挡时用“滚动到元素”或“模拟点击”
- 开启「AI优化元素」功能(设置-设计器-捕获元素时使用AI优化元素)
修复模板:
等待元素出现("目标元素", 超时=10)
滚动到元素("目标元素")
点击元素("目标元素")
报错2:变量未定义
现象:单个运行报错,整体运行却能通过。
原因:变量在使用前没有被赋值。
解决方法:
- 在使用变量的指令之前,先用“设置变量”指令给它赋一个初始值
- 或者在流程开头声明为全局变量
报错3:类型错误——字符串和数字拼接报错
错误信息:can only concatenate str (not "int") to str
原因:把数字直接和字符串用+拼接了。
解决方法:用str(数字变量)转成字符串。
# ❌ 错误
日志内容 = "当前页:" + 页码
# ✅ 正确
日志内容 = "当前页:" + str(页码)
在影刀里用“类型转换”指令,把整数转成文本。
报错4:列表索引超出范围
错误信息:list index out of range
原因:列表只有3个元素,却取了第5个(索引4)。
解决方法:取之前先判断列表长度。
如果 len(列表) > 4:
值 = 列表[4]
否则:
值 = ""
报错5:引擎运行失败
错误信息:应用执行失败:引擎运行失败
原因:
- 自定义指令里写了不兼容的语法
- 引用了不兼容的库
- Python环境损坏
解决方法:
- 检查应用日志看具体报错
- 大概率是元素定位失效或权限问题
- 重启影刀试试
报错6:获取窗口失败
现象:网速好的时候不报错、网速差的时候报错。
原因:网络问题。
解决方法:增加重试机制或加try-catch。
七、调试效率翻倍的5个小习惯
-
先手动跑通再上RPA:先手动操作一遍完整流程,搞清楚每一步的页面状态和可能出现的异常情况
-
关键步骤加日志:配合影刀的“变量值日志”指令,排查效率能提升不止一倍
-
异常处理不是越多越好:到处都是异常捕获会让代码变得又长又乱,反而更容易出bug
-
关键步骤前后加截图:出错后不需要重现现场,直接翻截图就能看到是哪一步出了问题
-
跑流程前先清缓存:很多奇怪的bug是因为浏览器缓存导致的
八、异常严重程度分级
并非所有异常都同等重要。根据异常的影响范围进行分级:
| 等级 | 名称 | 影响范围 | 处理策略 |
|---|---|---|---|
| P0 | 致命 | 整个流程无法继续 | 立即终止+告警+人工介入 |
| P1 | 严重 | 当前任务失败但可恢复 | 重试+降级处理+记录 |
| P2 | 一般 | 次要功能受影响 | 记录日志+继续执行 |
| P3 | 轻微 | 几乎无影响 | 静默处理 |
常见问题速查表
| 问题现象 | 根本原因 | 修复方法 |
|---|---|---|
| 流程报错但不知道哪一行 | 没加日志 | 关键步骤加“输出日志” |
| 元素有时能找到有时找不到 | 动态ID/在iframe中 | 加等待+检查iframe+开启AI优化 |
| 变量未定义 | 使用前没赋值 | 用“设置变量”赋初始值 |
| 字符串拼接报错 | 数字和字符串直接+ | 用str()转换 |
| 列表索引超出范围 | 取的索引大于列表长度 | 取之前先判断长度 |
| 获取窗口失败 | 网络问题 | 加重试机制 |
| 引擎运行失败 | Python环境/库问题 | 检查日志,重启影刀 |
推荐资源
- 影刀官方帮助文档搜索“异常捕获”或“Try-Catch”
- 影刀社区搜索“异常处理”或“报错排查”,有大量实战案例
- 影刀官方帮助文档“运行错误处理”,可配置全局邮件/企微告警
#影刀RPA #RPA自动化 #异常处理 #报错排查 #TryCatch #电商自动化
作者:林焱
本文为《影刀RPA学习手册》系列文章之一,内容源于实操经验的整理与分享。如果这篇文章对你有帮助,欢迎点赞收藏,下一篇我们聊“Excel与表格处理的完整指南”。
