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 收到的狀態值缺少有關根本原因的足夠資訊時,可能會傳回此錯誤。 |