<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Escape on Tarragon</title><link>https://tarrragon.github.io/blog/tags/escape/</link><description>Recent content in Escape on Tarragon</description><generator>Hugo -- gohugo.io</generator><language>zh-TW</language><copyright>Tarragon (CC BY 4.0)</copyright><lastBuildDate>Fri, 19 Jun 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://tarrragon.github.io/blog/tags/escape/index.xml" rel="self" type="application/rss+xml"/><item><title>error → retry → error 循環的逃生口設計</title><link>https://tarrragon.github.io/blog/ux-design/04-error-recovery/error-loop-escape/</link><pubDate>Fri, 19 Jun 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/ux-design/04-error-recovery/error-loop-escape/</guid><description>&lt;p>error → retry → error 循環是指使用者遇到錯誤、點擊重試、再次失敗、再次重試的迴圈。當底層問題持續存在時（伺服器關閉、認證過期、硬體故障），重試永遠不會成功。使用者被困在這個迴圈中，唯一的出路是殺掉 app。&lt;/p>
&lt;h2 id="循環產生的條件">循環產生的條件&lt;/h2>
&lt;p>三個條件同時成立時產生困住使用者的重試循環：&lt;/p>
&lt;p>&lt;strong>錯誤持續存在&lt;/strong>。暫時性錯誤（網路閃斷）會在重試中自行恢復。持續性錯誤（伺服器已關閉）不會因重試而改變。&lt;/p>
&lt;p>&lt;strong>UI 只提供重試選項&lt;/strong>。Error 畫面上唯一的按鈕是「重試」，沒有返回、取消或其他替代路徑。&lt;/p>
&lt;p>&lt;strong>沒有重試次數上限&lt;/strong>。使用者可以無限重試，每次都失敗，每次都回到同一個 error 畫面。&lt;/p>
&lt;p>app_tunnel 修復前的 error 和 disconnected 狀態就是這個模式 — 有重連按鈕但沒有 back 按鈕。重連失敗時使用者只能再次重連，無法返回首頁（&lt;a href="https://tarrragon.github.io/blog/ux-design/cases/five-states-zero-exits/" data-link-title="U.C1 Terminal 畫面五個狀態零個退出路徑" data-link-desc="Flutter app 的 Terminal 畫面有 idle/connecting/connected/error/disconnected 五個 enum 狀態，每個狀態都沒有 back 或 disconnect 按鈕 — 使用者一旦進入就出不去">U.C1&lt;/a>）。&lt;/p>
&lt;h2 id="逃生口設計">逃生口設計&lt;/h2>
&lt;h3 id="每個-error-畫面至少兩個選項">每個 error 畫面至少兩個選項&lt;/h3>
&lt;p>重試按鈕旁邊放一個退出路徑。「重試」+「返回首頁」是最小組合。使用者想繼續嘗試就重試，想離開就返回。&lt;/p>
&lt;p>這和&lt;a href="https://tarrragon.github.io/blog/ux-design/knowledge-cards/screen-state-matrix/" data-link-title="畫面狀態矩陣" data-link-desc="說明用四欄表格（顯示/可用操作/進入條件/退出路徑）系統性地暴露畫面導航缺口的設計工具">畫面狀態矩陣&lt;/a>的退出路徑要求一致 — 每個狀態至少一條退出路徑（&lt;a href="https://tarrragon.github.io/blog/ux-design/01-screen-state-machine/state-matrix-definition/" data-link-title="畫面狀態矩陣的定義與填寫方法" data-link-desc="四欄矩陣（顯示 / 可用操作 / 進入條件 / 退出路徑）的定義、填寫步驟和檢查規則 — 退出路徑為空 = UX 死胡同">定義與填寫方法&lt;/a>）。Error 狀態的退出路徑包括重試（回到 connecting 狀態）和返回（離開當前畫面）。&lt;/p>
&lt;h3 id="自動重試達上限後切換-ui">自動重試達上限後切換 UI&lt;/h3>
&lt;p>自動重試有固定上限（例如 3 次或 5 次）。達到上限後，UI 從「正在重試」切換到「連線失敗」，提供手動重試和退出路徑。&lt;/p>
&lt;p>切換 UI 的意義是向使用者傳達「自動恢復已經嘗試過了，需要你來判斷接下來怎麼做」。使用者可能知道問題的原因（忘了開伺服器、WiFi 沒連上），手動修正後再重試。&lt;/p>
&lt;h3 id="提供問題診斷線索">提供問題診斷線索&lt;/h3>
&lt;p>在 error 畫面提供足夠的資訊讓使用者判斷是否值得繼續重試。「伺服器沒有回應」和「認證已過期」是不同的問題 — 前者可能重試會成功（伺服器正在重啟），後者重試不會改變結果（需要重新登入）。&lt;/p>
&lt;p>診斷資訊幫助使用者做出正確決策：繼續重試、返回重新操作、或完全離開。&lt;/p>
&lt;h3 id="替代操作路徑">替代操作路徑&lt;/h3>
&lt;p>除了重試和返回，某些場景可以提供第三條路。連線特定伺服器失敗時，提供「選擇其他伺服器」的選項。認證失敗時，提供「用其他方式登入」的選項。&lt;/p>
&lt;p>替代路徑把「失敗 → 重試同樣的操作」擴展成「失敗 → 嘗試不同的操作」，增加使用者脫離困境的機會。&lt;/p>
&lt;h2 id="檢查方法">檢查方法&lt;/h2>
&lt;p>用畫面狀態矩陣檢查 error 和 retry 狀態：&lt;/p>
&lt;ol>
&lt;li>找到所有 error 狀態（矩陣中 type = error 的行）&lt;/li>
&lt;li>檢查每個 error 狀態的「可用操作」欄 — 是否除了「重試」之外還有其他操作&lt;/li>
&lt;li>檢查每個 error 狀態的「退出路徑」欄 — 是否有離開當前畫面的路徑&lt;/li>
&lt;li>操作欄只有「重試」且退出路徑為空 = 潛在的 retry loop&lt;/li>
&lt;/ol>
&lt;p>這個檢查在設計階段就能完成，成本遠低於實機測試時才發現使用者被困住。&lt;/p>
&lt;h2 id="下一步路由">下一步路由&lt;/h2>
&lt;ul>
&lt;li>錯誤訊息如何引導使用者行動 → &lt;a href="https://tarrragon.github.io/blog/ux-design/04-error-recovery/error-message-principles/" data-link-title="錯誤訊息撰寫原則" data-link-desc="錯誤訊息的兩個職責：使用者能讀懂發生什麼、使用者能決定下一步做什麼">錯誤訊息撰寫原則&lt;/a>&lt;/li>
&lt;li>重試策略的選擇 → &lt;a href="https://tarrragon.github.io/blog/ux-design/04-error-recovery/retry-mechanism-ux/" data-link-title="Retry 機制 UX" data-link-desc="自動 vs 手動重試、指數退避 vs 立即重試 — 重試策略的選擇取決於失敗的可恢復性和使用者的等待意願">Retry 機制 UX&lt;/a>&lt;/li>
&lt;li>畫面狀態矩陣的退出路徑檢查 → &lt;a href="https://tarrragon.github.io/blog/ux-design/01-screen-state-machine/" data-link-title="模組一：畫面狀態機設計" data-link-desc="畫面狀態矩陣（顯示 / 操作 / 進入 / 退出）— 退出路徑為空 = UX 死胡同">ux-design 模組一 畫面狀態機&lt;/a>&lt;/li>
&lt;li>Mock 遮蔽 error 場景的問題 → &lt;a href="https://tarrragon.github.io/blog/testing/01-test-strategy-layers/" data-link-title="模組一：測試策略分層" data-link-desc="Unit / Protocol Integration / Screen State 三層測試各自的職責、盲區和判斷原則">testing 模組一 測試策略分層&lt;/a>&lt;/li>
&lt;li>Error 事件的分類與收集 → &lt;a href="https://tarrragon.github.io/blog/monitoring/01-mental-model/" data-link-title="模組一：監控心智模型" data-link-desc="四類事件（event / error / metric / lifecycle）的分類與收集策略">monitoring 模組一 監控心智模型&lt;/a>&lt;/li>
&lt;/ul></description><content:encoded><![CDATA[<p>error → retry → error 循環是指使用者遇到錯誤、點擊重試、再次失敗、再次重試的迴圈。當底層問題持續存在時（伺服器關閉、認證過期、硬體故障），重試永遠不會成功。使用者被困在這個迴圈中，唯一的出路是殺掉 app。</p>
<h2 id="循環產生的條件">循環產生的條件</h2>
<p>三個條件同時成立時產生困住使用者的重試循環：</p>
<p><strong>錯誤持續存在</strong>。暫時性錯誤（網路閃斷）會在重試中自行恢復。持續性錯誤（伺服器已關閉）不會因重試而改變。</p>
<p><strong>UI 只提供重試選項</strong>。Error 畫面上唯一的按鈕是「重試」，沒有返回、取消或其他替代路徑。</p>
<p><strong>沒有重試次數上限</strong>。使用者可以無限重試，每次都失敗，每次都回到同一個 error 畫面。</p>
<p>app_tunnel 修復前的 error 和 disconnected 狀態就是這個模式 — 有重連按鈕但沒有 back 按鈕。重連失敗時使用者只能再次重連，無法返回首頁（<a href="/blog/ux-design/cases/five-states-zero-exits/" data-link-title="U.C1 Terminal 畫面五個狀態零個退出路徑" data-link-desc="Flutter app 的 Terminal 畫面有 idle/connecting/connected/error/disconnected 五個 enum 狀態，每個狀態都沒有 back 或 disconnect 按鈕 — 使用者一旦進入就出不去">U.C1</a>）。</p>
<h2 id="逃生口設計">逃生口設計</h2>
<h3 id="每個-error-畫面至少兩個選項">每個 error 畫面至少兩個選項</h3>
<p>重試按鈕旁邊放一個退出路徑。「重試」+「返回首頁」是最小組合。使用者想繼續嘗試就重試，想離開就返回。</p>
<p>這和<a href="/blog/ux-design/knowledge-cards/screen-state-matrix/" data-link-title="畫面狀態矩陣" data-link-desc="說明用四欄表格（顯示/可用操作/進入條件/退出路徑）系統性地暴露畫面導航缺口的設計工具">畫面狀態矩陣</a>的退出路徑要求一致 — 每個狀態至少一條退出路徑（<a href="/blog/ux-design/01-screen-state-machine/state-matrix-definition/" data-link-title="畫面狀態矩陣的定義與填寫方法" data-link-desc="四欄矩陣（顯示 / 可用操作 / 進入條件 / 退出路徑）的定義、填寫步驟和檢查規則 — 退出路徑為空 = UX 死胡同">定義與填寫方法</a>）。Error 狀態的退出路徑包括重試（回到 connecting 狀態）和返回（離開當前畫面）。</p>
<h3 id="自動重試達上限後切換-ui">自動重試達上限後切換 UI</h3>
<p>自動重試有固定上限（例如 3 次或 5 次）。達到上限後，UI 從「正在重試」切換到「連線失敗」，提供手動重試和退出路徑。</p>
<p>切換 UI 的意義是向使用者傳達「自動恢復已經嘗試過了，需要你來判斷接下來怎麼做」。使用者可能知道問題的原因（忘了開伺服器、WiFi 沒連上），手動修正後再重試。</p>
<h3 id="提供問題診斷線索">提供問題診斷線索</h3>
<p>在 error 畫面提供足夠的資訊讓使用者判斷是否值得繼續重試。「伺服器沒有回應」和「認證已過期」是不同的問題 — 前者可能重試會成功（伺服器正在重啟），後者重試不會改變結果（需要重新登入）。</p>
<p>診斷資訊幫助使用者做出正確決策：繼續重試、返回重新操作、或完全離開。</p>
<h3 id="替代操作路徑">替代操作路徑</h3>
<p>除了重試和返回，某些場景可以提供第三條路。連線特定伺服器失敗時，提供「選擇其他伺服器」的選項。認證失敗時，提供「用其他方式登入」的選項。</p>
<p>替代路徑把「失敗 → 重試同樣的操作」擴展成「失敗 → 嘗試不同的操作」，增加使用者脫離困境的機會。</p>
<h2 id="檢查方法">檢查方法</h2>
<p>用畫面狀態矩陣檢查 error 和 retry 狀態：</p>
<ol>
<li>找到所有 error 狀態（矩陣中 type = error 的行）</li>
<li>檢查每個 error 狀態的「可用操作」欄 — 是否除了「重試」之外還有其他操作</li>
<li>檢查每個 error 狀態的「退出路徑」欄 — 是否有離開當前畫面的路徑</li>
<li>操作欄只有「重試」且退出路徑為空 = 潛在的 retry loop</li>
</ol>
<p>這個檢查在設計階段就能完成，成本遠低於實機測試時才發現使用者被困住。</p>
<h2 id="下一步路由">下一步路由</h2>
<ul>
<li>錯誤訊息如何引導使用者行動 → <a href="/blog/ux-design/04-error-recovery/error-message-principles/" data-link-title="錯誤訊息撰寫原則" data-link-desc="錯誤訊息的兩個職責：使用者能讀懂發生什麼、使用者能決定下一步做什麼">錯誤訊息撰寫原則</a></li>
<li>重試策略的選擇 → <a href="/blog/ux-design/04-error-recovery/retry-mechanism-ux/" data-link-title="Retry 機制 UX" data-link-desc="自動 vs 手動重試、指數退避 vs 立即重試 — 重試策略的選擇取決於失敗的可恢復性和使用者的等待意願">Retry 機制 UX</a></li>
<li>畫面狀態矩陣的退出路徑檢查 → <a href="/blog/ux-design/01-screen-state-machine/" data-link-title="模組一：畫面狀態機設計" data-link-desc="畫面狀態矩陣（顯示 / 操作 / 進入 / 退出）— 退出路徑為空 = UX 死胡同">ux-design 模組一 畫面狀態機</a></li>
<li>Mock 遮蔽 error 場景的問題 → <a href="/blog/testing/01-test-strategy-layers/" data-link-title="模組一：測試策略分層" data-link-desc="Unit / Protocol Integration / Screen State 三層測試各自的職責、盲區和判斷原則">testing 模組一 測試策略分層</a></li>
<li>Error 事件的分類與收集 → <a href="/blog/monitoring/01-mental-model/" data-link-title="模組一：監控心智模型" data-link-desc="四類事件（event / error / metric / lifecycle）的分類與收集策略">monitoring 模組一 監控心智模型</a></li>
</ul>
]]></content:encoded></item></channel></rss>