今天,我們要為加入斷線重連機制:導入 UiPath 原生 Retry Scope(自動重試) 與 全域 Try Catch 例外防護!
一、 強韌性架構三大防禦層
一個合格的企業級 RPA 流程不能一遇到錯誤就舉白旗,必須具備以下三個層級的防護:
第一層:區域性自動自我修復(Auto Retry):
當遭遇網頁讀取延遲、元素暫時未渲染完成時,機器人自動原處重試 3 次,每次間隔 3 秒。80% 以上的網路抖動都能在這一層被悄無聲息地化解。
第二層:優雅降級與進度保全(Graceful Degradation):
如果重試 3 次後目標網頁真的完全當機,流程絕不能直接閃退,而是先將當前已成功抓取的專利資料「強制存檔」,避免前功盡棄。
第三層:全域災難告警(Failure Alerting):
在拋出異常中斷前,機器人主動向維運團隊的 Discord 頻道發送 🚨「高優先級故障快訊」,並附帶具體的錯誤訊息與當前中斷步驟,讓工程師能秒級定位問題。
二、 核心元件解析:UiPath 的 Retry Scope
屬性設定:
NumberOfRetries:3(最多重試 3 次)。
RetryInterval:00:00:03(每次重試前等待 3 秒緩衝)。
只要在 Action 內發生了 Selector 找不到或點擊超時,UiPath 會自動在背景等待 3 秒並重新執行該區塊,完全不需要額外寫複雜的迴圈邏輯!
三、 為脆弱的爬蟲迴圈套上防護罩
我們將其整併進 Try Catch 架構:
[Main Workflow]
└── Try
└── 專利巡檢與爬蟲作業
└── For Each Row (遍歷專利)
└── Retry Scope (最多重試 3 次,間隔 3 秒)
└── 點擊案號 ➔ 等待載入 ➔ 展開摘要 ➔ 萃取欄位
└── Catch (System.Exception)
├── Log Message: "[嚴重錯誤] 爬蟲主程序異常中斷: " + exception.Message
├── 緊急儲存當前已取得的歷史資料
└── 發送 Discord 災難告警 Payload
Discord 災難快訊 Payload 設計:
當進入 Catch 區塊時,機器人會立即發送鮮紅色的故障卡片,告知團隊當前狀態:
' 組裝故障通報 Payload
Dim alertObj = New Newtonsoft.Json.Linq.JObject(
New Newtonsoft.Json.Linq.JProperty("content", "🚨 **【系統中斷告警】專利情報機器人執行異常!**"),
New Newtonsoft.Json.Linq.JProperty("embeds", New Newtonsoft.Json.Linq.JArray(
New Newtonsoft.Json.Linq.JObject(
New Newtonsoft.Json.Linq.JProperty("title", "❌ 專利網站連線異常或元素定位超時"),
New Newtonsoft.Json.Linq.JProperty("color", 16711680), ' 亮紅色
New Newtonsoft.Json.Linq.JProperty("description", "機器人於巡檢過程遭遇無法修復之例外,已啟動緊急保全防護。"),
New Newtonsoft.Json.Linq.JProperty("fields", New Newtonsoft.Json.Linq.JArray(
New Newtonsoft.Json.Linq.JObject(
New Newtonsoft.Json.Linq.JProperty("name", "錯誤類型"),
New Newtonsoft.Json.Linq.JProperty("value", "`" & in_exType & "`"),
New Newtonsoft.Json.Linq.JProperty("inline", True)
),
New Newtonsoft.Json.Linq.JObject(
New Newtonsoft.Json.Linq.JProperty("name", "中斷案號"),
New Newtonsoft.Json.Linq.JProperty("value", If(String.IsNullOrEmpty(in_caseId), "尚未開始", in_caseId)),
New Newtonsoft.Json.Linq.JProperty("inline", True)
),
New Newtonsoft.Json.Linq.JObject(
New Newtonsoft.Json.Linq.JProperty("name", "詳細原因"),
New Newtonsoft.Json.Linq.JProperty("value", in_exMsg.Substring(0, Math.Min(in_exMsg.Length, 150)) & "..."),
New Newtonsoft.Json.Linq.JProperty("inline", False)
)
))
)
))
)
iThome鐵人賽