すべてのプロダクト
Search
ドキュメントセンター

Simple Log Service:例外処理

最終更新日:Sep 04, 2024

Simple Log Service SDKを使用してAPIリクエストをSimple Log Serviceに送信すると、ネットワークの中断またはネットワークの遅延により例外が発生する可能性があります。 このトピックでは、Simple Log Service SDKを使用してAPIリクエストを送信するときに発生する可能性のある例外の処理ロジックについて説明します。

例外タイプと処理メカニズム

SDK例外は、次のタイプに分類されます。

  • Simple Log Serviceによって返される例外。 このタイプの例外は、Simple Log Service SDKによって処理されます。 このタイプの例外の詳細については、各API操作の説明とエラーコードを参照してください。 エラーコードの詳細については、「エラーコード」をご参照ください。

  • Simple Log Service SDKを使用してリクエストを送信するときに発生するネットワーク例外。 このタイプの例外には、ネットワーク切断やサーバー応答タイムアウトが含まれます。

  • Simple Log Service SDKによって生成され、プラットフォームやプログラミング言語に関連する例外 (メモリオーバーフローなど) 。

各プログラミング言語のSimple Log Service SDKは、処理の例外をスローします。

  • Simple Log Serviceによって返される例外と、APIリクエストの送信中に発生するネットワーク例外は、Simple Log Service SDKによって処理されます。 次に、Simple Log Service SDKはLogExceptionクラスの例外をパッケージ化し、例外をスローします。

  • Simple Log Service SDKによって生成され、プラットフォームおよびプログラミング言語に関連する例外は、Simple Log Service SDKでは処理されません。 Simple Log Service SDKは、関連するプラットフォームとプログラミング言語のNative Exceptionクラスで例外を直接パッケージ化し、例外をスローします。

LogException

LogExceptionクラスは、Simple Log Service SDKによって定義され、Simple Log Serviceのロジックに関連する例外を処理するために使用されます。 LogExceptionクラスは、各プログラミング言語で例外を処理するために使用される基本クラスを継承します。 LogExceptionクラスは、次の例外情報を提供します。

  • エラーコード: 例外タイプを示します。 Simple Log Serviceによって返される例外のエラーコードは、関連するAPIエラーコードと同じです。 ネットワーク例外のエラーコードはRequestErrorです。 さまざまなプログラミング言語のエラーコードの詳細については、「APIリファレンス」をご参照ください。

  • エラーメッセージ: 例外を説明するメッセージを示します。 Simple Log Serviceによって返される例外のエラーメッセージは、関連するAPIエラーメッセージと同じです。 ネットワーク例外のエラーメッセージはリクエストが失敗しました。 さまざまなプログラミング言語でのエラーメッセージの詳細については、「APIリファレンス」をご参照ください。

  • リクエストID: 例外が発生したリクエストのIDを示します。 リクエストIDはSimple Log Serviceによって生成されます。 リクエストIDは、Simple Log Serviceがエラーメッセージを返す場合にのみ有効です。 それ以外の場合、IDは空の文字列です。 APIリクエストの送信時に例外が発生した場合は、関連するリクエストIDを記録し、トラブルシューティングのためにSimple Log Serviceチームに提供できます。

リクエストの失敗と再試行

Simple Log Service SDKを使用してSimple Log Serviceにアクセスする場合、一時的なネットワークの切断、伝送遅延、サーバー応答の遅さなどのさまざまな例外が原因で、アクセス要求が失敗することがあります。 Simple Log Serviceは例外を直接スローし、再試行ロジックは実装しません。 この場合、リクエストの再試行や例外のスローなど、カスタム処理ロジックを指定する必要があります。

たとえば、中国 (杭州) リージョンのbig-gameという名前のプロジェクトにアクセスすると、ネットワーク例外が発生します。 例外を処理するには、さまざまなプログラミング言語で次のコードを使用して、再試行の回数を指定します。

// Other code. 
// Configure environment variables. In this example, the AccessKey ID and AccessKey secret are obtained from environment variables. 
String accessId = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID");   
String accessKey = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"); 
String project = "big-game";
String endpoint = "cn-hangzhou.sls.aliyuncs.com";
int max_retries = 3;
/*
 * Create a client. 
 */
Client client = new Client(accessId, accessKey, endpoint);
ListLogStoresRequest lsRequest = new ListLogStoresRequest(project);
for (int i = 0; i < max_retries; i++)
{
    try
    {
        ListLogStoresResponse res = client.ListLogStores(lsRequest);
        // Process the returned response. 
        break;
    }
    catch(LogException e)
    {
        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(Exception ex)
    {
        System.out.println("unrecoverable exception when listing logstores.");
        break;
    }
}
// Other code.
// Other code. 
// Configure environment variables. In this example, the AccessKey ID and AccessKey secret are obtained from environment variables. 
String accessId = Environment.GetEnvironmentVariable("ALIBABA_CLOUD_ACCESS_KEY_ID");     
String accessKey = Environment.GetEnvironmentVariable("ALIBABA_CLOUD_ACCESS_KEY_SECRET");    
String project = "big-game";
String endpoint = "cn-hangzhou.sls.aliyuncs.com";
int max_retries = 3;
// Create a client. 
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);
        // Process the returned response. 
        break;
    }
    catch(LogException e)
    {
        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(Exception ex)
    {
        Console.Writeline("unrecoverable exception when listing logstores.");
        break;
    }
}
// Other code.
<?php
// Other code. 
$endpoint = 'cn-hangzhou.sls.aliyuncs.com';
// Configure environment variables. In this example, the AccessKey ID and AccessKey secret are obtained from environment variables. 
$accessId = getenv('ALIBABA_CLOUD_ACCESS_KEY_ID'); 
$accessKey = getenv('ALIBABA_CLOUD_ACCESS_KEY_SECRET'); 
$maxRetries = 3;
// Create a client. 
$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);
        // Process the returned response. 
        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;
    }
}
// Other code.
from aliyun.log import LogClient, ListLogstoresRequest, LogException;

# Other code. 
from aliyun.log.logclient import xrange

endpoint = 'cn-hangzhou.log.aliyuncs.com'
# Configure environment variables. In this example, the AccessKey ID and AccessKey secret are obtained from environment variables. 
accessId = os.environ.get('ALIBABA_CLOUD_ACCESS_KEY_ID', '')
accessKey =  os.environ.get('ALIBABA_CLOUD_ACCESS_KEY_SECRET', '')
maxRetries = 3
# Create a client. 
client = LogClient(endpoint, accessId, accessKey)
project = 'big-game'
lsRequest = ListLogstoresRequest(project)
for i in xrange(maxRetries):
    try:
        res = client.ListLogstores(lsRequest)
        # Process the returned response. 
        break
    except LogException as e:
        if e.get_error_code() == "RequestError":
            if i+1 == maxRetries:
                print("error code :" + e.get_error_code())
                print("error message :" + e.get_error_message())
                break
            else:
                print("request error happens, retry it!")
        else:
            print("error code :" + e.get_error_code())
            print("error message :" + e.get_error_message())
            print("error requestId :" + e.get_request_id())
            break
    except Exception as ex:
        print("unrecoverable exception when listing logstores.")
        break
# Other code.