FFX 子工具中的錯誤

FHO Errorffx_error 的比較類型

在子工具邊界中,我們有由 ffx 程式庫定義的錯誤類型,用於向主要 ffx 工具指出該錯誤是否應回報為錯誤。

在舊版外掛程式系統中,您可以藉由 ffx_errorffx_bail 巨集指出錯誤,應直接向使用者回報錯誤,同時在記錄檔中註明任何其他詳細資料。系統會將任何其他 anyhow 錯誤視為 BUG,並發出重大警告並提供相關資訊,說明該在記錄檔何處查看。

雖然這個做法仍然有效,而且新的錯誤類型能正確從 anyhow 錯誤中吸收這項資訊,但我們還是不建議您繼續以這種方式處理。這樣令人困惑不清,而且使用者學習如何透過其他工具編寫工具時,往往無法察覺這些巨集的使用方式。

將錯誤轉換為 fho::Error

anyhow 不同的是,fho 的錯誤類型不會嘗試直接吸收任何錯誤。請改用 FfxContext 特徵的方法來指出想要處理錯誤的方式。

如要將錯誤視為使用者錯誤,您可以使用 user_messagewith_user_message,為該錯誤新增使用者可見的結構定義 (同時保留錯誤鏈以供診斷):

process(filename).with_user_message(|| format!("Failed to process {filename}"))?;

相反地,您應該將其視為錯誤,因為不應發生此情況,使用者也不太可能採取任何簡單的操作來解決問題:

do_thing().bug()?;

這可強制對於向使用者呈現錯誤的方式提供有用的意識。

錯誤類型的適用時機

對於整個程式碼集,透過執行緒處理這種錯誤類型,並不一定需要或非常樂意。您可能繼續使用 anyhow,或者最好在程式庫程式碼和工具的較低層級部分使用 thiserror。接下來,您就能將這些錯誤轉譯成與 ffx 相容的錯誤。

在程式庫程式碼周圍保留界線,以便決定如何顯示錯誤。建議您盡可能讓所有與使用者互動相關的內容都保持精簡,然後將所需資料傳遞至其他層層,以便於此處做出更明智的決策。

其中極為簡單的範例:

let stuff = get_user_input().user_message("Your input made no sense!")?;
stuff.act_on_it().bug()?;