SDK のエラーは次のように分類できます。
- Log Service より SDK に返されるエラー (詳細は、Log Service API の「Common error codes」および 各 API のドキュメントを参照)
- SDK より Log Service にリクエストを送信した際に発生するネットワークエラー (ネットワークの中断や Log Service のレスポンスにタイムアウト)
- SDK で発生したプラットフォームやプログラム関連のエラー (メモリオーバーフローなど)
SDK でエラーが発生した場合、現時点では、どの言語でも例外が返されます。 基本的には次のように処理されます。
- 上記の 1 つ目および 2 つ目のエラーは、SDK の LogException クラスがユーザーに返されます。
- 3 つ目のエラーは、SDK では処理されませんが、プラットフォームまたは言語の例外クラスがユーザーに返されます。
LogException
SDK の LogException クラスには、Log Service に論理的なエラーが発生した際の処理が定義されています。 いずれの言語でも、基本の例外クラスは継承され、次の例外情報が渡されます。
- エラーコード: エラーの種類を示します。 Log Service の返すエラーの場合、API から返されたエラーコードになります。 SDK リクエストによるネットワークエラーの場合、エラーコードは 「RequestError」となります。 詳細については、各言語の API 完全リファレンスをご参照ください。
- エラーメッセージ: Log Service の返すエラーの場合、API から返されたエラーメッセージになります。 SDK リクエストによるネットワークエラーの場合、 エラーメッセージは「request is failed (リクエストに失敗)」となります。 詳細については、各言語の API 完全リファレンスをご参照ください。
- リクエスト ID: エラーの発生した Log Service リクエストの ID。 エラーメッセージが返された場合にのみリクエスト ID が入ります。 返すエラーメッセージがない場合は、空の文字列になります。 リクエストエラーが発生した場合は、チケットを起票して、サービスセンターにお問い合わせください。 その際、リクエスト ID をお知らせください。
リクエストに失敗およびリクエストの再試行
SDK より Log Service にアクセスする場合は、一時的なネットワーク断、伝送遅延、または、Log Service の処理に時間がかかる、といったことが原因でリクエストに失敗することがあります。 この種のエラーは、現時点では、そのまま例外として返され、Log Service はリクエストを再試行しません。 したがって、SDK を使用する場合には、その場合の処理を定義する必要があります (リクエストを再試行するか、そのままエラーを返す)。
例
中国 (杭州) リージョンの big-game プロジェクトにアクセスした際に、ネットワーク例外が発生した場合、リクエストを指定の回数再試行するとします。 各言語のコードは次のようになります。
Java:
// これより前のコードは省略
String accessId = "your_access_id"; // TODO: Alibaba Cloud AccessKey ID を指定
String accessKey = "your_access_key"; // TODO: Alibaba Cloud AccessKey Secret を指定
String project = "big-game";
String endpoint = "cn-hangzhou.sls.aliyuncs.com";
int max_retries = 3;
/*
* クライアントを作成
*/
Client client = new client (adord, accesskey, endpoint );
ListLogStoresRequest lsRequest = new ListLogStoresRequest(project);
for (int i = 0; i < max_retries; i++)
{
try
{
ListLogStoresResponse res = client.ListLogStores(lsRequest)
//TODO: レスポンスに対する処理を記述
break;
}
catch(LogException ex)
{
if (e.GetErrorCode() == "RequestError")
{
if ( i == max_retries - 1)
{
System.out.println("request is still failed after all retries.");
break;
}
else
System.out.println("request error happens, retry it!") ;
}
else
{
System.out.println("error code :" + e.GetErrorCode());
System.out.println("error message :" + e.GetErrorMessage());
System.out.println("error requestId :" + e.GetRequestId());
break;
}
}
catch(...)
{
System.out.println("unrecoverable exception when listing logstores.");
break;
}
}
// 以降のコードは省略
. NET(C#):
// これより前のコードは省略
String accessId = "your_access_id"; //TODO: Use your Alibaba Cloud AccessKey ID.
String accessKey = "your_access_key"; //TODO: Use your Alibaba Cloud AccessKey Secret.
String project = "big-game";
String endpoint = "cn-hangzhou.sls.aliyuncs.com";
int max_retries = 3;
// クライアントを作成
SLSClient client = new SLSClient(endpoint, accessId, accessKey);
ListLogstoresRequest request = new ListLogstoresRequest();
request.Project = project;
for (int i = 0; i < max_retries; i++)
{
try
{
ListLogstoresResponse response = client.ListLogstores(request);
//TODO: レスポンスに対する処理を記述
break;
}
catch(LogException ex)
{
if (e.errorCode == "SLSRequestError")
{
if ( i == max_retries - 1)
{
Console.Writeline(“request is still failed after all retries.”);
break;
}
else
{
Console.Writeline("request error happens, retry it!") ;
}
}
else
{
Console.Writeline("error code :" + e.errorCode;
Console.Writeline("error message :" + e.Message;
Console.Writeline("error requestId :" + e.RequestId;
break;
}
}
catch(...)
{
Console.Writeline("unrecoverable exception when listing logstores.");
break;
}
}
// 以降のコードは省略
PHP:
<? php
// これより前のコードは省略
$endpoint = 'cn-hangzhou.sls.aliyuncs.com';
$accessId = 'your_access_id'; // TODO: Alibaba Cloud AccessKey ID を指定
$accessKey = 'your_access_key'; //TODO: Alibaba Cloud AccessKey Secret を指定
$maxRetries = 3;
// クライアントを作成
$client = new Aliyun_Sls_Client($endpoint, $accessId, $accessKey);
$project = 'big-game';
$request = new Aliyun_Sls_Models_ListLogstoresRequest($project);
for($i = 0; $i < $maxRetries; ++$i)
{
try
{
$response = $client->ListLogstores($request);
//TODO: レスポンスに対する処理を記述
break;
}
catch (Aliyun_Sls_Exception $e)
{
if ($e->getErrorCode()=='RequestError')
{
if ($i+1 == $maxRetries)
{
echo "error code :" . $e->getErrorCode() . PHP_EOL;
echo "error message :" . $e->getErrorMessage() . PHP_EOL;
break;
}
echo 'request error happens, retry it!' . PHP_EOL;
}
else
{
echo "error code :" . $e->getErrorCode() . PHP_EOL;
echo "error message :" . $e->getErrorMessage() . PHP_EOL;
echo "error requestId :" . $e->getRequestId() . PHP_EOL;
break;
}
}
catch (Exception $ex)
{
echo 'unrecoverable exception when listing logstores.' . PHP_EOL;
var_dump($ex);
break;
}
}
// 以降のコードは省略
Python:
// これより前のコードは省略
endpoint = 'cn-hangzhou.sls.aliyuncs.com'
accessId = 'your_access_id' # TODO: Alibaba Cloud AccessKey ID を指定
$accessKey = 'your_access_key'; //TODO: Alibaba Cloud AccessKey Secret を指定
maxRetries = 3
# Construct a client
client = Client(endpoint, accessId, accessKey)
project = 'big-game'
lsRequest = ListLogstoresRequest(project)
for i in xrange(maxRetries):
try:
res = client.ListLogstores(lsRequest)
# TODO: レスポンスに対する処理を記述
break
except LogException as e:
if e.getErrorCode() == "RequestError":
if i+1 == maxRetries:
print "error code :" + e.getErrorCode()
print "error message :" + e.getErrorMessage()
break
else:
print "request error happens, retry it!"
else:
print "error code :" + e.getErrorCode()
print "error message :" + e.getErrorMessage()
print "error requestId :" + e.getRequestId()
break
except Exception as e:
print 'unrecoverable exception when listing logstores.'
break
// 以降のコードは省略