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:),但裝置已沒有食物,就可能會擲回這個例外狀況。 | 
    
unauthenticated | 
      無法識別呼叫端,或要求不具備有效的驗證憑證。 | 
unavailable | 
      這項服務無法使用。這很可能是暫時性問題,可透過重試輪詢來解決。請注意,重試非等冪運算並不一定安全。 | 
unimplemented | 
      這項服務未實作、支援或啟用要求的作業。 | 
unknown | 
      發生不明錯誤,一般來說,如果發生無法使用其他錯誤代碼分類的錯誤情況,就會顯示 unknown。舉例來說,當從外部 API 收到的狀態值缺乏根本原因的充分資訊時,就可能傳回此錯誤; |