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 を処理する際は、code フィールドと message フィールドを確認して、何が問題だったかを確認します。

例外を処理しないと、アプリがクラッシュします。

次の表に、表示される可能性がある HomeException コードの意味を示します。

表: HomeException код
コード 意味
ABORTED オペレーションは、通常、シーケンサー チェックの失敗、またはトランザクションの中止などの同時実行の問題のために中止されています。
ALREADY_EXISTS クライアントが作成しようとしたエンティティ(ファイルやディレクトリなど)はすでに存在します。
API_NOT_CONNECTED クライアントが、接続に失敗した API からメソッドを呼び出そうとしました。これは、デバイスがオフラインの場合や、クライアントが呼び出そうとした API をサポートしていない場合に発生することがあります。
CANCELLED オペレーションがキャンセルされました。通常、キャンセルは呼び出し元により行われます。
DATA_LOSS 復元できないデータ損失またはデータ破損が発生しました。
DEADLINE_EXCEEDED オペレーションが完了する前に期限が切れました。システムの状態を変更するオペレーションの場合、オペレーションが正常に終了しても、このエラーが返されることがあります。
FAILED_PRECONDITION システムがオペレーションの実行に必要な状態ではないため、オペレーションが拒否されました。たとえば、すでに停止しているオーブンで OvenCavityOperationalStateTraitstop コマンドが呼び出された場合や、ディレクトリ以外の場所で rmdir オペレーションの実行を試みた場合に、このメッセージが表示されることがあります。
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 から受信したステータス値に根本原因に関する十分な情報がない場合に、このエラーが返されることがあります。