例外処理

Thing-IF SDK の API には、呼び出しによって例外が発生するものがあります。ここでは、例外への対処処理の詳細について示します。

サンプルコードでの記載

本ガイドのサンプルコードでは、エラーハンドリングの必要箇所のみを示し、詳細(メッセージの出力やエラーからの回復処理など)は省略しています。

たとえば、コマンド送信の解説では、次のようなサンプルコードを扱っています。

api.postNewCommand("AirConditioner-Demo", schemaVersion: 1, actions: actions, completionHandler: { (command: Command?, error: ThingIFError?)-> Void in
  if error != nil {
    // Handle the error.
    return
  }
})

API の実行でエラーが発生すると、コールバックとなっているブロックの引数にエラーオブジェクトが渡されます。問題が発生しない場合、エラーオブジェクトは nil となります。

API からのエラーは、列挙子 ThingIFError を使って通知されます。ThingIFError が取り得る値は、Appledoc を参照してください。

詳細情報の取得

ThingIFError の値が ERROR_RESPONSE である場合、詳細情報を取得できます。ERROR_RESPONSE は、Thing-IF SDK が REST API を実行し、その REST API がエラー応答したことを表します。詳細情報は、特に開発時において問題の原因を特定する作業に役立ちます。

詳細情報の例

たとえば、コマンドを送信する直前にオーナーユーザーの 無効化 を行うと、アクセストークンが無効になってコマンドの送信に失敗します。この際、取得できる詳細情報の例は次のとおりです。

api.postNewCommand("AirConditioner-Demo", schemaVersion: 1, actions: actions, completionHandler: { (command: Command?, error: ThingIFError?)-> Void in
  if error != nil {
    switch error! {
    case .CONNECTION:
      print("Failed to connect to Thing Interaction Framework")
    case .ERROR_RESPONSE(let errorResponse):
      print("Received an error from Thing Interaction Framework")
      print("httpStatusCode: \(errorResponse.httpStatusCode)")
      print("errorCode: \(errorResponse.errorCode)")
      print("errorMessage: \(errorResponse.errorMessage)")
    default:
      print("Failed for another reason")
    }
    return;
  }
}
Received an error from Thing Interaction Framework
httpStatusCode: 403
errorCode: WRONG_TOKEN
errorMessage: The provided token is not valid

この例は無効なアクセストークンを使用した場合の実行結果です。記載されているプロパティから、nil が返ることはありませんが、エラーによっては空文字を返す場合があります。

ERROR_RESPONSE は、構造体 ErrorResponse で表現される詳細情報を持っています。これを switchcase の構文により変数 errorResponse に取得してプロパティにアクセスします。

  • httpStatusCode プロパティ

    REST API が返した HTTP のステータスコードを返します。

  • errorCode プロパティ

    エラーの原因を示す文字列を返します。モバイルアプリのプログラムで、エラーの内容ごとに処理を振り分けたい場合などに使用できます。

    REST API が返した詳細情報のうち、errorCode フィールドの文字列に対応します。

  • errorMessage プロパティ

    デバッグ用メッセージを返します。

    REST API が返した詳細情報のうち、message フィールドの文字列に対応します。

負荷集中時のエラー

サーバーに対して、一定時間内に通常の負荷を大きく超えるアクセスが発生した場合、そのアプリケーションでは API がエラーを返します。この制限値は、利用契約に基づいてアプリケーションごとに定められます。

この制限値には余裕があるため、通常の運用負荷の変動では問題なく動作する設計ですが、例えば特定の時刻にアクティブユーザーが一斉にリクエストを行うような機能はエラーの発生につながります。

上限に達した場合、各 API は REST API の実行エラーと同様、ERROR_RESPONSE でエラーを返します。この際、詳細情報の httpStatusCode プロパティ 429 を、errorCode プロパティと errorMessage プロパティは空文字列をそれぞれ返します。

通常、モバイルアプリでは、このエラーをサーバーでの想定外エラーとして処理できますが、輻輳を防止するため、API の再試行は避けるように実装してください。