Exception Handling
Some APIs in the Thing-IF SDK throw exceptions. In this topic, we explain how you can handle the exceptions.
Sample code in the guides
In the guides, we provide sample code to illustrate how you can leverage our SDKs. In the sample code, the exception handling is usually simplified; the message output and error recovery are omitted. The exception is handled with try
and catch
blocks following the basic method of exception processing in Java.
For example, we present the following sample code when we explain how to send a command:
try {
Command command = api.postNewCommand("AirConditioner-Demo", 1, actions);
} catch (ThingIFException e) {
// Handle the error.
}
If you use JDeferred for implementing your mobile app, you would pass the handler of exception processing to the fail()
method of a promise.
In order to get the details of an exception, check the type of the exception object and downcast the exception to the matching type.
mAdm.when(executeApi1()
).fail(new FailCallback<Throwable>() {
@Override
public void onFail(final Throwable tr) {
if (tr instanceof ForbiddenException) {
// The token was invalid.
} else if (tr instanceof ThingIFRestException) {
// An error occurred in Thing Interaction Framework.
ThingIFRestException restException = (ThingIFRestException)tr;
Log.i(TAG, "HTTP Status:" + restException.getStatusCode());
} else if (tr instanceof ThingIFException) {
// An error occurred in the Thing-IF SDK.
}
}
});
Types of exceptions
For the Thing-IF SDK, get the exception data with the ThingIFException
class or its subclass. The ThingIFException
class is at the root level for the exception classes of the Thing-IF SDK.
The following figure illustrates the exception classes of the Thing-IF SDK:
The Thing-IF SDK uses the exception classes of the com.kii.thingif.exception
package. Be careful when you use the APIs of the Thing-IF SDK and the Kii Cloud SDK together because some classes with the same name are included in the com.kii.thingif.exception
package of the Thing-IF SDK and the com.kii.cloud.storage.exception.app
package of the Kii Cloud SDK.
Execution error of the REST API
When the REST API of Thing Interaction Framework returns an error in response to an API call, the error is notified with the ThingIFRestException
class or its subclass.
The Thing-IF SDK returns one of the following exceptions according to the HTTP status code that is returned by the REST API. For the HTTP status codes returned by the REST API, see Thing-IF REST API Documentation.
HTTP status | Exception type |
---|---|
400 | BadRequestException |
401 | UnauthorizedException |
403 | ForbiddenException |
404 | NotFoundException |
409 | ConflictException |
500 | InternalServerErrorException |
503 | ServiceUnavailableException |
504 | GatewayTimeoutException |
Other | ThingIFRestException |
Validate the length and characters of the returned string with your app before you pass the string to an API as a parameter. Usually, the client SDK checks parameters and notifies any error with a subclass of the RuntimeException
class such as java.lang.IllegalArgumentException
. Especially, if you implement a catch
block with the ThingIFException
class, make sure to validate the parameter. Otherwise, your mobile app will not catch a RuntimeException
object and crash.
It is difficult to define all the exceptions and error codes thrown by each API in advance. Kii recommends defining only the exceptions that you want to address, such as duplicated users and communication errors, and processing the remaining exceptions as general errors. Exceptions and error codes might be added or updated in newer versions of the SDK and the server.
A process such as getting an owner access token uses APIs of the Kii Cloud SDK. For handling exceptions that occur with those APIs, see Exception Handling for the Kii Cloud SDK.
Error details
Sometimes you can get the details of an error returned by the REST API. Such information is useful for determining the root cause of an error, especially during your development.
This section explains how to get the details of an error returned by the REST API.
You can catch an error returned by the REST API with the ThingIFRestException
class or its subclass.
Example of error details
For example, if you disable an owner user before the owner sends a command, their access token becomes invalid and the command sending fails. When this happens, you can get the error details as follows:
try {
Command command = api.postNewCommand("AirConditioner-Demo", 1, actions);
} catch (ThingIFRestException e) {
System.out.println("-- class");
System.out.println(e.getClass());
System.out.println("-- getStatusCode()");
System.out.println(e.getStatusCode());
System.out.println("-- getErrorCode()");
System.out.println(e.getErrorCode());
System.out.println("-- getMessage()");
System.out.println(e.getMessage());
} catch (ThingIFException e) {
// Handle the error.
}
-- class
class com.kii.thingif.exception.ForbiddenException
-- getStatusCode()
403
-- getErrorCode()
WRONG_TOKEN
-- getMessage()
curl -v -X POST -H 'Content-Type:application/json' -H 'X-Kii-SDK:sn=at;sv=0.11.0;pv=23' -H 'X-Kii-AppID:11111111' -H 'X-Kii-AppKey:22222222222222222222222222222222' -H 'Authorization:Bearer AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' 'https://api-jp.kii.com/thing-if/apps/11111111/targets/thing:th.0123456789ab-cdef-0123-4567-89abcdef/commands' -d '{"actions":[{"turnPower":{"power":true}}],"issuer":"user:abcdef012345-6789-abcd-ef01-23456789","schema":"AirConditioner-Dema","schemaVersion":1}' ## Server Returned HttpStatus:403 The provided token is not valid
This example shows an execution result with an invalid access token. Prepare for cases when not all details are available, such as a case when a value of null is returned.
getStatusCode()
methodThis method returns a HTTP status code that the REST API returns.
getErrorCode()
methodThis method returns a string that indicates the cause of an error. This method is useful when you want to assign a process by error type in your mobile app.
The return value corresponds to the string in the
errorCode
field that is one of the error details returned by the REST API.getMessage()
methodThis method returns error details for debugging.
Error details vary depending on the error type, including a sample of the
curl
command that is helpful when you reproduce the error and a REST API message for debugging in themessage
field.
Kii recommends that you provide error details when you contact Kii Support.
Too many requests
The API returns an error if there are accesses that greatly exceed the ordinary load to the server within a certain period of time for an application. This limit is set per application under an agreement with Kii.
The limit is high enough for ordinary changes in the operational load. However, if active users simultaneously send a request on the same time or event, it could cause an API error.
If the number of API calls exceeds the limit, each API returns an error with the ThingIFRestException
class that is a subclass of the ThingIFException
class. The getStatusCode()
method returns 429 and the getErrorCode()
method and the getMessage()
method return a null value.
Usually, a mobile app processes this error as an unexpected error on the server. To avoid congestion, do not implement a retry process for executing the API.