Todos los productos
Search
Centro de documentos

Tablestore:Manejo de errores del SDK de Go

Última actualización: Sep 03, 2026

El kit de desarrollo de software (SDK) de Go para Tablestore utiliza excepciones para manejar los errores. Este tema describe cómo Tablestore gestiona los errores, la información que contienen las excepciones y las directivas de reintentos disponibles.

Método

El SDK de Go para Tablestore lanza una excepción cuando ocurre un error. Una llamada a la API se considera correcta si no lanza ninguna excepción; en caso contrario, la operación falló.

Nota

Para las operaciones por lotes, como BatchGetRow y BatchWriteRow, compruebe no solo las excepciones, sino también el estado de cada fila. La llamada a la API se considera correcta únicamente cuando todas las filas se procesan correctamente.

Excepciones

Al usar el SDK de Go para Tablestore, generalmente se devuelve una excepción como segundo parámetro del valor de retorno de un método. Por lo tanto, antes de recuperar los datos devueltos, compruebe si el parámetro err tiene algún valor.

Si ocurre un error del lado del servidor en Tablestore, el parámetro err contiene un requestId. El requestId es un identificador único universal (UUID) que identifica la solicitud de forma inequívoca. Si no logra resolver el problema, registre este requestId y envíe un ticket.

A continuación se muestra un ejemplo de código sobre cómo manejar excepciones:

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)
    }
}

Reintentos

El SDK de Go proporciona una directiva de reintentos predeterminada. También puede personalizar la lógica de reintentos.

Directiva de reintentos predeterminada

El SDK de Go realiza un reintento con retroceso cuando ocurre un error de limitación o un error interno del servidor durante una operación de lectura. El número máximo de reintentos predeterminado es 10, y la duración total máxima predeterminada para los reintentos es de 5 segundos. Modifique tablestore.TableStoreConfig para establecer los parámetros de la directiva de reintentos predeterminada. En la siguiente tabla se describen estos parámetros.

Parámetro

Descripción

Valor predeterminado

RetryTimes

Número máximo de reintentos.

10

MaxRetryTime

Duración total máxima para los reintentos.

5s

DefaultRetryInterval

Valor de variación aleatoria para la directiva de reintentos con retroceso exponencial. Esto evita que varios clientes con errores inicien solicitudes de reintento simultáneamente.

10 ms

MaxRetryInterval

Intervalo de tiempo máximo entre dos reintentos.

320 ms

Transport

Gestiona las propiedades subyacentes de transporte del cliente HTTP. El valor predeterminado es nil.

Si establece este parámetro, los parámetros HTTPTimeout.ConnectionTimeout, MaxIdleConnections e IdleConnTimeout no surtirán efecto.

nil

HTTPTimeout.ConnectionTimeout

Tiempo de espera para establecer una nueva conexión de red HTTP.

15s

HTTPTimeout.RequestTimeout

Tiempo máximo que un cliente HTTP espera la respuesta del servidor después de enviar una solicitud.

30s

MaxIdleConnections

Número máximo de conexiones inactivas para un host HTTP.

2000

IdleConnTimeout

Duración máxima que una conexión inactiva para un host HTTP permanece abierta en el pool de conexiones sin reutilizarse.

25s

Lógica de reintentos personalizada

Para modificar la lógica de reintentos predeterminada o crear una lógica personalizada, configure los siguientes parámetros en TableStoreClient.

Parámetro

Descripción

Valor predeterminado

CustomizedRetryFunc

Si configura CustomizedRetryFunc, el SDK consulta primero este método para determinar si debe reintentar.

  • Si CustomizedRetryFunc no está configurado (es nil), el SDK ejecuta la lógica de reintentos predeterminada.

  • Si CustomizedRetryFunc no es nil y determina que se requiere un reintento, el SDK lo realiza según la lógica personalizada.

  • Si CustomizedRetryFunc no es nil y determina que no se requiere un reintento, el SDK comprueba el valor de KeepDefaultRetryStrategyWhileUsingCustomizedRetryFunc para decidir la acción a seguir.

    • Si KeepDefaultRetryStrategyWhileUsingCustomizedRetryFunc es false, no se realiza ningún reintento.

    • Si KeepDefaultRetryStrategyWhileUsingCustomizedRetryFunc es true, el SDK consulta entonces la lógica de reintentos predeterminada para determinar si debe reintentar.

nil

KeepDefaultRetryStrategyWhileUsingCustomizedRetryFunc

true

Los siguientes ejemplos muestran cómo personalizar la lógica de reintentos:

Reintentar todos los errores

El siguiente ejemplo muestra cómo reintentar ante cualquier error.

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
}

No reintentar ningún error

El siguiente ejemplo muestra cómo deshabilitar los reintentos para todos los errores.

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 en el reintento

Para ejecutar operaciones predefinidas cuando el SDK reintenta una operación, configure el siguiente parámetro en TableStoreClient.

Parámetro

Descripción

Valor predeterminado

RetryNotify

Método de callback que se activa cuando el SDK realiza un reintento.

nil

El siguiente ejemplo muestra cómo establecer un ID de rastreo del lado del negocio para cada solicitud e imprimir dicho ID cuando ocurre un reintento.

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 continuación se muestra un ejemplo de la salida generada:

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