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
時,請檢查 code
和 message
欄位,瞭解發生錯誤的原因。
任何未處理的例外狀況都會導致應用程式當機。
下表列出您可能會遇到的 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 |
已耗盡某些資源 (可能是達到每位使用者的配額,也可能是整個檔案系統的空間不足)。舉例來說,如果對寵物餵食器裝置呼叫 DispenseTrait 的 dispense 指令,但裝置已沒有食物,就可能會擲回這項錯誤。 |
SDK_INITIALIZATION_MISSING_INFO |
初始化 SDK 時未提供所有必要資訊。
舉例來說,如果用戶端嘗試取得特定特徵 ID 的 TraitFactory ,但初始化 SDK 時未納入該特徵,系統就會擲回這項錯誤。請參閱「在 Android 裝置上初始化住家」。 |
UNAUTHENTICATED |
無法識別呼叫端,或要求不具備有效的驗證憑證。 |
UNAVAILABLE |
這項服務無法使用。這很可能是暫時性問題,可透過重試輪詢來解決。請注意,重試非等冪運算並不一定安全。 |
UNIMPLEMENTED |
這項服務未實作、支援或啟用要求的作業。 |
UNKNOWN |
發生不明錯誤,如果發生無法使用任何其他錯誤代碼分類的錯誤狀況,系統會顯示 UNKNOWN 。舉例來說,當從外部 API 收到的狀態值缺乏足夠的根本原因資訊時,就可能傳回此錯誤; |