Swift 內建支援功能,可在執行階段擲回及擷取可復原的錯誤。舉例來說,如果程式碼中的作業失敗或無效,API 就會擲回 HomeError 錯誤。這樣一來,您只需專注於可復原的錯誤,簡化錯誤處理流程。接著,您可以提供選項,例如讓使用者重試,或顯示「找不到結構」等訊息。而且,由於您不必明確處理所有可能的例外狀況,程式碼會更簡潔,因此能更專注於主要目的。
以下舉例說明如何處理可復原的失敗:
let light1 = lightDevices.first
if let light = light1 {
do {
try await structure.move(device: light, to: room)
} catch let error as HomeError {
// Code for handling the exception
}
下表列出您可能會遇到的 HomeError 代碼及其意義:
| 程式碼 | 意義 |
|---|---|
aborted |
作業已中止,這通常會在發生並行問題時出現,例如排序檢查失敗或交易取消。 |
alreadyExists |
您嘗試建立的資源或實體已存在。 例如溫度控制器的命名時間表。 |
cancelled |
作業已取消 (通常由呼叫端取消)。 |
dataLoss |
無法復原的資料遺失或損毀。 |
deadlineExceeded |
在作業完成前已過期。針對會變更系統狀態的作業,即便作業順利完成也有可能會傳回這個錯誤。舉例來說,雖然伺服器成功提供回應,但因為延遲時間過長而導致超過期限。 |
failedPrecondition |
系統未處於執行作業所需的狀態,因此作業遭拒。 舉例來說,如果您對已停止的烤箱呼叫 stop,就可能會收到這則訊息。 |
internal |
內部錯誤。這表示基礎系統預期的某些不變量已遭破壞。這個錯誤代碼僅用於嚴重錯誤。 |
invalidArgument |
用戶端指定的引數無效。請注意,這與「failedPrecondition」不同。「invalidArgument」表示無論系統狀態為何,引數都有問題 (例如檔案名稱格式錯誤)。 |
notFound |
您指定的實體或資源不存在。例如,在媒體播放器裝置上呼叫
play 時,指定不存在的曲目 ID。 |
outOfRange |
根據目前的系統狀態,參數超出有效範圍。如果值在 API 呼叫可能接受的範圍內,但在目前的情境中不合理,就會顯示這則訊息。 |
permissionDenied |
您的權限不足,無法執行指定作業。請勿將這個錯誤代碼解讀為要求在其他方面有效。 |
resourceExhausted |
某項資源已耗盡。舉例來說,如果使用者在餵食器裝置上呼叫
dispense(item:amount:unit:presetName:),但裝置中沒有食物,系統就會擲回這個錯誤。這也可能是因為超出 Home API 專案配額。詳情請參閱「配額管理」。 |
unauthenticated |
無法識別呼叫端,或要求不含有效的驗證憑證。 |
unavailable |
服務無法使用,這極有可能是暫時情況,並能透過重試來修正。請注意,重試非冪等作業不一定安全。 |
unimplemented |
這項服務未實作、支援或啟用要求的作業。 |
unknown |
發生不明錯誤,一般來說,如果發生無法使用其他錯誤代碼分類的錯誤狀況,就會顯示 unknown。舉例來說,如果從外部 API 收到的狀態值缺少根本原因的充分資訊,就可能傳回這項錯誤。 |