影刀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
打开网页(URL:https://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包裹每次采集操作,可以保证一条失败不影响其他条。
循环(ForEach,item in ${product_list})
Try
获取元素文本(目标元素:商品标题)→ 保存到 ${title}
获取元素文本(目标元素:商品价格)→ 保存到 ${price}
写入Excel(行:当前行,列1:${title},列2:${price})
Catch
打印日志:"采集第" + ${index} + "条数据失败,跳过")
继续循环 ← 关键:跳过当前条,继续下一条
End Try
结束循环
四、Try-Catch的常见误区
误区1:Catch块里什么都不写
有些新手会把 Catch块留空——什么逻辑都不写。
这样做的结果是:异常被"吞掉"了,你根本不知道流程出了什么问题。
正确做法:至少在 Catch块里写日志,记录异常信息。
Catch
打印日志:"异常信息:" + ${exception_message})
截图(保存路径:./logs/error.png)
误区2:Finally块里放业务逻辑
Finally块的本来用途是清理资源(关闭文件、关闭浏览器等)。

有些新手会在 Finally里放业务逻辑,比如"写入Excel"。
这样做的问题是: Finally无论如何都会执行——即使 Try里已经正常完成了业务逻辑,结果 Finally里又执行了一遍,导致重复。
正确做法: Finally里只放清理逻辑,不放业务逻辑。
误区3:Try块里放太多指令
Try块的粒度要合适——不要太大,也不要太小。
太大:一出异常,你不知道具体是哪条指令出的问题。
太小:到处都是 Try-Catch,流程看起来很乱。
建议: Try块里放一个完整的功能单元,比如"打开网页并等待加载完成",这一个单元包在一个 Try里。
五、可控异常用If判断,不要用Try-Catch
前面说了,异常分两类:可控和不可控。

可控异常应该用If判断来处理,不要用 Try-Catch。
举例:检查文件是否存在
错误做法(用Try-Catch):
Try
打开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写入、异常处理整合到一个完整案例里。
作者:林焱 | 转载请注明出处
更多推荐




所有评论(0)