Ao usar o SDK do Simple Log Service para enviar requisições de API, podem ocorrer exceções devido a interrupções de rede ou latência. Este tópico descreve como o SDK trata essas exceções e como implementar lógica de nova tentativa.
Tipos de exceção e mecanismo de tratamento
As exceções do SDK dividem-se nos seguintes tipos:
Exceções retornadas pelo Simple Log Service. O SDK trata esses casos automaticamente. Para mais detalhes, consulte as descrições das operações de API e Códigos de erro.
Exceções de rede ocorridas durante o envio de requisições pelo SDK, como desconexão de rede e tempo limite de resposta do servidor.
Exceções específicas da plataforma e da linguagem geradas pelo SDK, como estouro de memória.
O SDK lança exceções de maneira diferente em cada linguagem de programação:
O SDK encapsula exceções retornadas pelo servidor e exceções de rede na classe LogException e as lança.
O SDK não trata exceções específicas da plataforma e da linguagem. A plataforma e a linguagem correspondentes encapsulam essas exceções na classe Native Exception e as lançam diretamente.
LogException
O SDK define a classe LogException para tratar exceções relacionadas à lógica do Simple Log Service. Essa classe herda da classe base de exceção de cada linguagem de programação e fornece as seguintes informações:
Código de erro: indica o tipo da exceção. Para exceções retornadas pelo servidor, corresponde ao código de erro da API. Para exceções de rede, o código é
RequestError. Consulte a Referência de API para mais informações.Mensagem de erro: descreve a exceção. Nas exceções retornadas pelo servidor, equivale à mensagem de erro da API. Nas exceções de rede, a mensagem é
request is failed.Consulte a Referência de API para mais detalhes.ID da requisição: identifica a requisição que provocou a exceção. O Simple Log Service gera esse ID, válido apenas quando o servidor retorna um erro; caso contrário, será uma string vazia. Forneça esse ID à equipe do Simple Log Service para auxiliar na solução de problemas.
Falhas de requisição e novas tentativas
Durante o uso do SDK do Simple Log Service, as requisições podem falhar por motivos como desconexão temporária de rede, latência de transmissão ou resposta lenta do servidor. O SDK lança exceções diretamente, sem implementar lógica de nova tentativa. Implemente seu próprio tratamento personalizado, como repetir a requisição ou lançar uma exceção específica.
Exemplos
Os exemplos a seguir demonstram como tratar exceções de rede com lógica de nova tentativa ao acessar um projeto chamado big-game na região China (Hangzhou):
// 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.