Todos os produtos
Search
Central de documentação

Tablestore:Tratamento de erros

Última atualização: Jul 03, 2026

O Tablestore SDK for Go trata erros como exceções. Este tópico descreve os métodos de tratamento de erros e as políticas de nova tentativa do Tablestore SDK for Go.

Métodos

O Tablestore SDK for Go gerencia erros na forma de exceções. Uma operação é considerada bem-sucedida quando não gera exceção. Caso contrário, a falha na execução indica que a operação não foi concluída com êxito.

Nota

Operações em lote, como BatchGetRow e BatchWriteRow, só têm sucesso quando o sistema confirma a ausência de exceções e o status bem-sucedido de cada linha individualmente.

Exceções

Ao utilizar o Tablestore SDK for Go, o parâmetro err é retornado como segundo parâmetro na resposta. Verifique se há valor no parâmetro err antes de processar os resultados da operação.

Se ocorrer um erro no servidor, o parâmetro err retornará um requestId. Esse ID corresponde ao UUID usado para identificar a requisição. Caso o problema persista, registre o valor do parâmetro requestId e envie um ticket.

O exemplo de código a seguir demonstra o tratamento de erros:

client := tablestore.NewClient(endpoint, instanceName, accessKeyId, accessKeySecret)
listTables, err := client.ListTable()
if err != nil {
    // Handle exceptions. 
    fmt.Println(err.Error())
} else {
    // No exceptions. 
    for _, table := range listTables.TableNames {
        fmt.Println("TableName: ", table)
    }
}

Novas tentativas

O Tablestore SDK for Go inclui uma política padrão de nova tentativa. Também é possível definir políticas personalizadas conforme sua necessidade.

Política padrão de nova tentativa

Diante de erros de limitação ou falhas internas do servidor em operações de escrita, o Tablestore SDK for Go executa automaticamente até 10 novas tentativas em 5 segundos, aplicando backoff exponencial. Para alterar os parâmetros padrão, configure tablestore.TableStoreConfig. A tabela abaixo detalha esses parâmetros.

Parâmetro

Descrição

Valor padrão

RetryTimes

Quantidade máxima de novas tentativas.

10

MaxRetryTime

Tempo máximo permitido para a execução das tentativas.

5s

DefaultRetryInterval

Valor de variação (jitter) para o backoff exponencial, evitando requisições simultâneas de múltiplos clientes.

10 ms

MaxRetryInterval

Intervalo máximo entre duas tentativas consecutivas.

320 ms

Transport

Atributo de transporte para clientes HTTP. Valor padrão: nil.

Ao especificar este parâmetro, as configurações HTTPTimeout.ConnectionTimeout, MaxIdleConnections e IdleConnTimeout perdem o efeito.

nil

HTTPTimeout.ConnectionTimeout

Tempo limite para estabelecer uma conexão HTTP.

15s

HTTPTimeout.RequestTimeout

Tempo de espera pela resposta do servidor.

30s

MaxIdleConnections

Número máximo de conexões ociosas mantidas.

2000

IdleConnTimeout

Período máximo que um host pode permanecer ocioso no pool de conexões.

25s

Lógica personalizada de nova tentativa

É possível ajustar a lógica padrão ou implementar uma estratégia própria configurando os seguintes parâmetros em TableStoreClient. Consulte a tabela abaixo para mais detalhes.

Parâmetro

Descrição

Valor padrão

CustomizedRetryFunc

Ao definir CustomizedRetryFunc, o sistema decide sobre a execução de novas tentativas com base nessa configuração.

  • Sem a definição de CustomizedRetryFunc, o valor padrão nil é assumido e a lógica padrão de nova tentativa entra em vigor.

  • Caso o valor indique permissão para nova tentativa, o sistema segue a lógica personalizada especificada.

  • Se o valor indicar que não deve haver nova tentativa, o comportamento depende da configuração de KeepDefaultRetryStrategyWhileUsingCustomizedRetryFunc.

    • Com KeepDefaultRetryStrategyWhileUsingCustomizedRetryFunc definido como false, nenhuma nova tentativa ocorre.

    • Com KeepDefaultRetryStrategyWhileUsingCustomizedRetryFunc definido como true, o sistema avalia a necessidade de nova tentativa usando a lógica padrão.

nil

KeepDefaultRetryStrategyWhileUsingCustomizedRetryFunc

true

Exemplo de lógica personalizada de nova tentativa:

Repetir todas as requisições com falha

Código de exemplo para repetir todas as requisições que falharam:

func alwaysRetry(errorCode string, errorMsg string, action string, httpStatus int) bool {
	return true
}
func main() {
    client := tablestore.NewClient(endpoint, instanceName, accessKeyId, accessKeySecret)
  	client.CustomizedRetryFunc = alwaysRetry
    // do something
}

Não repetir nenhuma requisição com falha

Código de exemplo para desativar novas tentativas em caso de falha:

func alwaysNotRetry(errorCode string, errorMsg string, action string, httpStatus int) bool {
	return false
}
func main() {
    client := tablestore.NewClient(endpoint, instanceName, accessKeyId, accessKeySecret)
  	client.CustomizedRetryFunc = alwaysNotRetry
    client.KeepDefaultRetryStrategyWhileUsingCustomizedRetryFunc = false
    // do something
}

Configure callbacks de nova tentativa

Para executar ações predefinidas durante uma nova tentativa, configure o seguinte parâmetro em TableStoreClient. Veja a descrição na tabela abaixo.

Parâmetro

Descrição

Valor padrão

RetryNotify

Callback acionado durante uma nova tentativa.

nil

O código abaixo ilustra como defina um traceID para cada requisição e exibi-lo quando ocorrer uma nova tentativa.

func userRetryNotify(traceId, requestId string, err error, action string, backoffDuration time.Duration) {
    // Configure the retry callback. 
    fmt.Println("Retry for traceId: " + traceId + ", timestamp: " + strconv.FormatInt(time.Now().UnixNano(), 10))
}

func alwaysRetry(errorCode string, errorMsg string, action string, httpStatus int) bool {
    return true
}

func main() {
    client := tablestore.NewClient(endpoint, instanceName, accessKeyId, accessKeySecret)
    client.CustomizedRetryFunc = alwaysRetry
    client.RetryNotify = userRetryNotify

    request := &tablestore.DescribeTableRequest{TableName: "tableNotExist"}
    // Set the traceID of the request. 
    request.ExtraRequestInfo.SetTraceID("test_TraceId_" + strconv.FormatInt(time.Now().UnixNano(), 10))
    // do something
    res, err := client.DescribeTable(request)

    if err != nil {
        fmt.Println(err.Error())
    } else {
        fmt.Println(res.ResponseInfo.RequestId)
    }
}

Resposta de exemplo:

Retry for traceId: test_TraceId_1711097752255675000, timestamp: 1711097752655394000
Retry for traceId: test_TraceId_1711097752255675000, timestamp: 1711097752683437000
Retry for traceId: test_TraceId_1711097752255675000, timestamp: 1711097752708603000
Retry for traceId: test_TraceId_1711097752255675000, timestamp: 1711097752760519000
Retry for traceId: test_TraceId_1711097752255675000, timestamp: 1711097752814590000
Retry for traceId: test_TraceId_1711097752255675000, timestamp: 1711097752916539000
Retry for traceId: test_TraceId_1711097752255675000, timestamp: 1711097753110943000
Retry for traceId: test_TraceId_1711097752255675000, timestamp: 1711097753454311000
Retry for traceId: test_TraceId_1711097752255675000, timestamp: 1711097753798531000
Retry for traceId: test_TraceId_1711097752255675000, timestamp: 1711097754165411000
OTSObjectNotExist Requested table does not exist. 0006143b-fdd6-5050-10ef-700b045590fc