影刀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

关键点

  1. 主流程只包一个大的Try-Catch,保证任何未捕获的异常都不会导致流程无声崩溃。

  2. 每个子流程内部,也根据自己的需要加Try-Catch。比如"采集数据"子流程里,每一条数据的采集都用 Try-Catch包裹,保证一条失败不影响其他条。

  3. Finally块里做清理,确保无论成功还是失败,资源都会被释放。


九、常见异常速查表

异常类型 可能原因 处理建议
元素未找到 元素失效、网页未加载完 修复元素;加等待时间;用Try-Catch包裹
超时 网络慢、服务器响应慢 增大超时时间设置;加重试逻辑
Excel被占用 文件被其他程序打开 在Finally块里确保关闭Excel;运行前检查文件是否被占用
权限不足 没有操作目标文件的权限 以管理员身份运行影刀RPA;检查文件权限设置
元素属性变化 网页改版 修复元素;改用更稳定的定位方式(如id)

十、结语

异常处理的核心目标只有一个:

在这里插入图片描述

让流程在遇到意外时,能够优雅地处理,而不是直接崩溃。

Try-Catch用好了,你的流程会健壮很多。

回头看最重要的一句:

可控异常用If判断,不可控异常用Try-Catch。

把这个原则记住,异常处理就不会乱用了。

下一篇讲数据采集实战,把循环、Excel写入、异常处理整合到一个完整案例里。


作者:林焱 | 转载请注明出处

Logo

电商企业物流数字化转型必备!快递鸟 API 接口,72 小时快速完成物流系统集成。全流程实战1V1指导,营造开放的API技术生态圈。

更多推荐