例外処理
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
で表現される詳細情報を持っています。これを switch
~case
の構文により変数 errorResponse
に取得してプロパティにアクセスします。
httpStatusCode
プロパティREST API が返した HTTP のステータスコードを返します。
errorCode
プロパティエラーの原因を示す文字列を返します。モバイルアプリのプログラムで、エラーの内容ごとに処理を振り分けたい場合などに使用できます。
REST API が返した詳細情報のうち、
errorCode
フィールドの文字列に対応します。errorMessage
プロパティデバッグ用メッセージを返します。
REST API が返した詳細情報のうち、
message
フィールドの文字列に対応します。
負荷集中時のエラー
サーバーに対して、一定時間内に通常の負荷を大きく超えるアクセスが発生した場合、そのアプリケーションでは API がエラーを返します。この制限値は、利用契約に基づいてアプリケーションごとに定められます。
この制限値には余裕があるため、通常の運用負荷の変動では問題なく動作する設計ですが、例えば特定の時刻にアクティブユーザーが一斉にリクエストを行うような機能はエラーの発生につながります。
上限に達した場合、各 API は REST API の実行エラーと同様、ERROR_RESPONSE
でエラーを返します。この際、詳細情報の httpStatusCode
プロパティ 429 を、errorCode
プロパティと errorMessage
プロパティは空文字列をそれぞれ返します。
通常、モバイルアプリでは、このエラーをサーバーでの想定外エラーとして処理できますが、輻輳を防止するため、API の再試行は避けるように実装してください。