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 を処理するときは、
error.code フィールドと
error.message フィールドを確認して、何が問題だったかを把握します。サブエラーコードも存在する可能性があるため、
getSubErrorCodes() メソッドを呼び出して結果を確認してください。
処理されない例外があると、アプリがクラッシュします。
次の表に、発生する可能性のある HomeException コードの意味を示します。
| コード | 意味 |
|---|---|
ABORTED |
オペレーションは、通常、シーケンサー チェックの失敗、またはトランザクションの中止などの同時実行の問題のために中止されています。 |
ALREADY_EXISTS |
クライアントが作成しようとしたエンティティ(ファイル やディレクトリなど)はすでに存在します。 |
API_NOT_CONNECTED |
クライアントが、接続に失敗した API のメソッドを呼び出そうとしました。 これは、デバイスがオフラインの場合や、クライアントが呼び出そうとした API をデバイスがサポートしていない場合に発生することがあります。 |
CANCELLED |
オペレーションがキャンセルされました。通常、キャンセルは呼び出し元により行われます。 |
COMMAND_FAILED |
コマンドの実行に失敗しました。詳細については、サブエラーコードをご確認ください。 |
CURSOR_WINDOW_NOT_SUPPORTED |
CursorWindow を使用するメソッドが呼び出されましたが、現在のコンテキストで CursorWindow が有効になっていないか、サポートされていません。 |
DATA_LOSS |
回復不能なデータ損失または破損が発生しました。 |
DEADLINE_EXCEEDED |
オペレーションが完了する前に期限が切れました。システムの状態を変更するオペレーションの場合、オペレーションが正常に終了しても、このエラーが返されることがあります。 |
DECOMMISSIONING_INELIGIBLE |
デバイスが廃止の対象ではないため、廃止に失敗しました。 |
FAILED_PRECONDITION |
システムがオペレーションの実行に必要な状態ではないため、オペレーションが拒否されました。たとえば、すでに停止しているオーブンで OvenCavityOperationalStateTrait の stop コマンドが呼び出された場合、このメッセージが表示されることがあります。 |
INTERNAL |
内部エラー。これは、基盤となるシステムで予期される一部の不変条件が満たされていないことを意味します。このエラーコードは 深刻なエラーのために予約されています。 |
INVALID_ARGUMENT |
クライアントが、想定される値の範囲外の 引数を指定しました。 |
INVALID_DATA_HOLDER |
データホルダーが無効です。 |
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 コマンドが呼び出されたときに、ユニットにフードが残っていない場合、このエラーがスローされることがあります。これは、Home API プロジェクトの割り当てを超えていることが原因である可能性もあります。詳細については、割り当ての管理をご覧ください。 |
SDK_INITIALIZATION_MISSING_INFO |
必要な情報がすべて揃っていない状態で SDK が初期化されました。
たとえば、クライアントが
特定の特性 ID の TraitFactory を取得しようとしたときに、SDK の初期化時にその特性が含まれていなかった場合、このエラーがスローされます。Android でホームを初期化するをご覧ください。 |
UNAUTHENTICATED |
呼び出し元を特定できないか、リクエストに有効な 認証情報がありません。 |
UNAVAILABLE |
サービスを利用できません。これは、バックオフで再試行することで解決できる可能性が高い一時的な 状態です。非べき等オペレーションの再試行が常に安全であるとは限りません。 |
UNIMPLEMENTED |
リクエストされたオペレーションが、このサービスで実装、サポート、有効化されていません。 |
UNKNOWN |
不明なエラーが発生しました。UNKNOWN は、他のエラーコードを使用して分類できないエラー条件が発生した場合に表示されます。たとえば、外部 API から受信したステータス値に根本原因に関する十分な情報がない場合、このエラーが返されることがあります。 |
WRITE_FAILED |
書き込みの実行に失敗しました。詳細については、サブエラーコードをご確認ください。 |