Todos os produtos
Search
Central de documentação

Tablestore:Go SDK error handling

Última atualização: Aug 04, 2026

O kit de desenvolvimento de software (SDK) Go do Tablestore usa exceções para tratar erros. Este tópico descreve como o Tablestore lida com falhas, as informações contidas nas exceções e as políticas de nova tentativa disponíveis.

Método

O SDK Go do Tablestore lança uma exceção quando ocorre um erro. Uma chamada de API é bem-sucedida se não lançar exceções. Caso contrário, a operação falhou.

Nota

Para operações em lote, como BatchGetRow e BatchWriteRow, verifique não apenas as exceções, mas também o status de cada linha. A chamada de API só terá sucesso completo quando todas as linhas forem processadas corretamente.

Exceções

Ao usar o SDK Go do Tablestore, uma exceção geralmente é retornada como o segundo parâmetro do valor de retorno de um método. Portanto, antes de recuperar os dados retornados, verifique se o parâmetro err possui algum valor.

Se ocorrer um erro no lado do servidor no Tablestore, o parâmetro err conterá um requestId. O requestId é um identificador universalmente único (UUID) que identifica a solicitação de forma exclusiva. Se você não conseguir resolver o problema, registre esse requestId e envie um ticket.

O código a seguir exemplifica o tratamento de exceções:

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

Novas tentativas

O SDK Go oferece uma política padrão de novas tentativas. Você também pode personalizar a lógica de repetição.

Política padrão de novas tentativas

O SDK Go executa uma nova tentativa com backoff quando ocorre um erro de limitação ou um erro interno do servidor durante uma operação de leitura. O número máximo padrão de tentativas é 10, e a duração total máxima padrão é de 5 segundos. Modifique tablestore.TableStoreConfig para definir os parâmetros da política padrão. A tabela a seguir descreve esses parâmetros.

Parâmetro

Descrição

Valor padrão

RetryTimes

Número máximo de novas tentativas.

10

MaxRetryTime

Duração total máxima para as tentativas.

5s

DefaultRetryInterval

Valor de jitter para a política de backoff exponencial. Isso impede que vários clientes com falha iniciem solicitações de nova tentativa simultaneamente.

10 ms

MaxRetryInterval

Intervalo de tempo máximo entre duas tentativas.

320 ms

Transport

Gerencia as propriedades subjacentes de transporte do cliente HTTP. O valor padrão é nil.

Se você definir este parâmetro, os parâmetros HTTPTimeout.ConnectionTimeout, MaxIdleConnections e IdleConnTimeout não terão efeito.

nil

HTTPTimeout.ConnectionTimeout

Tempo limite para estabelecer uma nova conexão de rede HTTP.

15s

HTTPTimeout.RequestTimeout

Tempo máximo que um cliente HTTP aguarda por uma resposta do servidor após enviar uma solicitação.

30s

MaxIdleConnections

Número máximo de conexões ociosas para um host HTTP.

2000

IdleConnTimeout

Duração máxima que uma conexão ociosa para um host HTTP permanece aberta no pool de conexões sem ser reutilizada.

25s

Lógica personalizada de novas tentativas

Para alterar a lógica padrão ou criar uma lógica personalizada de novas tentativas, defina os seguintes parâmetros para TableStoreClient.

Parâmetro

Descrição

Valor padrão

CustomizedRetryFunc

Se você definir CustomizedRetryFunc, o SDK verifica primeiro esse método para determinar se deve executar uma nova tentativa.

  • Caso CustomizedRetryFunc não esteja definido (seja nil), o SDK executa a lógica padrão de novas tentativas.

  • Quando CustomizedRetryFunc não é nil e determina que uma nova tentativa é necessária, o SDK realiza a repetição com base na lógica personalizada.

  • Se CustomizedRetryFunc não for nil e determinar que nenhuma nova tentativa é necessária, o SDK verifica o valor de KeepDefaultRetryStrategyWhileUsingCustomizedRetryFunc para decidir a próxima ação.

    • Quando KeepDefaultRetryStrategyWhileUsingCustomizedRetryFunc é false, nenhuma nova tentativa é executada.

    • Se KeepDefaultRetryStrategyWhileUsingCustomizedRetryFunc for true, o SDK consulta a lógica padrão para decidir se realiza uma nova tentativa.

nil

KeepDefaultRetryStrategyWhileUsingCustomizedRetryFunc

true

Os exemplos a seguir mostram como personalizar a lógica de novas tentativas:

Repetir todos os erros

Este exemplo demonstra como tentar novamente diante de qualquer erro.

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 nenhum erro

O exemplo abaixo ilustra como desativar novas tentativas para todos os erros.

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
}

Callback em nova tentativa

Para executar operações predefinidas quando o SDK repetir uma operação, defina o seguinte parâmetro para TableStoreClient.

Parâmetro

Descrição

Valor padrão

RetryNotify

Método de callback acionado quando o SDK executa uma nova tentativa.

nil

O exemplo a seguir mostra como definir um ID de rastreamento do lado da aplicação para cada solicitação e imprimir esse ID quando ocorrer uma nova tentativa.

func userRetryNotify(traceId, requestId string, err error, action string, backoffDuration time.Duration) {
    // Custom logic that is invoked when a retry is triggered.
    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 business-side trace ID for 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)
    }
}

A saída a seguir serve como 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