Android 上的錯誤處理

Kotlin 不支援檢查例外狀況。這樣可以簡化及簡化錯誤處理程序,因為您可以選擇只處理可能可復原的例外狀況。此外,您不必明確處理所有可能的例外狀況,因此程式碼較不雜亂,可專注於主要用途。

可復原的失敗是指開發人員可從自身解決的問題。 舉例來說,如果呼叫中使用的 ID 無效,API 會擲回含有 invalid data 訊息的 HomeException。應用程式開發人員可以選擇從快取中移除該 ID,或向使用者顯示「找不到結構」等訊息。

以下是處理可復原失敗的範例:

val result =
   try {
     homeManager.requestPermissions()
   } catch (e: HomeException) {
     PermissionsResult(
       PermissionsResultStatus.ERROR,
       "Got HomeException with error: ${e.message}",
     )
   }

Home API 中的任何方法都可能擲回 HomeException,因此建議您使用 try-catch 區塊,在所有呼叫中擷取 HomeException

處理 HomeException 時,請檢查 codemessage 欄位,瞭解發生錯誤的原因。

任何未處理的例外狀況都會導致應用程式當機。

下表列出您可能會遇到的 HomeException 代碼意義:

表格:HomeException 代碼
程式碼 意義
ABORTED 作業已取消,原因通常是排序器檢查失敗或交易取消等並行問題。
ALREADY_EXISTS 用戶端嘗試建立的實體 (例如檔案或目錄) 已存在。
API_NOT_CONNECTED 用戶端嘗試呼叫 API 中的方法,但連線失敗。如果裝置處於離線狀態,或不支援用戶端嘗試呼叫的 API,就可能發生這種情況。
CANCELLED 作業已取消 (通常由呼叫端取消)。
DATA_LOSS 發生無法復原的資料遺失或損毀情形。
DEADLINE_EXCEEDED 已超過期限,但作業尚未完成。針對會變更系統狀態的作業,即使作業順利完成也有可能會傳回這個錯誤。
FAILED_PRECONDITION 作業已遭拒絕,因為系統未處於執行該作業所需的狀態,舉例來說,如果對已停止的烤箱呼叫 stop 指令,或嘗試在非目錄上執行 rmdir 作業,就可能會收到這則訊息。OvenCavityOperationalStateTrait
INTERNAL 內部錯誤。這表示基礎系統預期的特定不變值已損毀。此錯誤代碼僅在發生嚴重錯誤時使用。
INVALID_ARGUMENT 用戶端提供的引數超出預期值範圍。
NOT_FOUND 找不到要求的實體,例如檔案或目錄。 如果系統拒絕整類使用者的要求 (例如逐步推出功能或未記錄的許可清單),則可使用 NOT_FOUND。如果拒絕某個使用者類別 (例如以使用者為準的存取控制) 中部分使用者的要求,則必須使用 PERMISSION_DENIED
OUT_OF_RANGE 嘗試執行的作業超出有效範圍,例如搜尋或讀取超過 end-of-file 的內容。與 INVALID_ARGUMENT 不同,這個錯誤表示問題可能在系統狀態變更後修正。
PERMISSION_DENIED 呼叫者沒有執行指定作業的權限。對於因耗用某些資源所導致的拒絕情形,不得使用 PERMISSION_DENIED (請針對這些錯誤改用 RESOURCE_EXHAUSTED)。如果無法識別呼叫端,請勿使用 PERMISSION_DENIED (若發生這類錯誤,請改用 UNAUTHENTICATED)。此錯誤代碼並不表示要求有效,或是要求的實體已存在或是滿足其他先決條件。
RESOURCE_EXHAUSTED 已耗盡某些資源 (可能是達到每位使用者的配額,也可能是整個檔案系統的空間不足)。舉例來說,如果對寵物餵食器裝置呼叫 DispenseTraitdispense 指令,但裝置已沒有食物,就可能會擲回這項錯誤。
SDK_INITIALIZATION_MISSING_INFO 初始化 SDK 時未提供所有必要資訊。 舉例來說,如果用戶端嘗試取得特定特徵 ID 的 TraitFactory,但初始化 SDK 時未納入該特徵,系統就會擲回這項錯誤。請參閱「在 Android 裝置上初始化住家」。
UNAUTHENTICATED 無法識別呼叫端,或要求不具備有效的驗證憑證。
UNAVAILABLE 這項服務無法使用。這很可能是暫時性問題,可透過重試輪詢來解決。請注意,重試非等冪運算並不一定安全。
UNIMPLEMENTED 這項服務未實作、支援或啟用要求的作業。
UNKNOWN 發生不明錯誤,如果發生無法使用任何其他錯誤代碼分類的錯誤狀況,系統會顯示 UNKNOWN。舉例來說,當從外部 API 收到的狀態值缺乏足夠的根本原因資訊時,就可能傳回此錯誤;