Códigos de error
Cada error tiene un código estable. Los SDK usan los mismos códigos (Unity, como enum), además de algunos para problemas que ocurren antes de que la solicitud llegue al servidor.
Los comentarios del código y los nombres de la API se mantienen en inglés para que coincidan con los SDK.
Errores de la API#
| Código | HTTP | Unity | Cuándo | ¿Reintentar? |
|---|---|---|---|---|
validation | 400, 422 | Validation | Entrada no válida; details.fields indica el campo. | No |
unauthorized | 401 | Unauthorized | Claves incorrectas, o un token de jugador ausente, caducado o revocado. | No |
forbidden | 403 | Forbidden | Proyecto suspendido, endpoint exclusivo de servidor o HTTPS obligatorio. | No |
plan_limit | 403 | PlanLimit | Se alcanzó un límite del plan (jugadores, entradas, almacenamiento…). No se elimina nada. | No |
not_found | 404 | NotFound | Endpoint, tabla de clasificación, jugador o clave de guardado desconocidos. | No |
conflict | 409 | Conflict | Ya se hizo, p. ej., una recompensa ya reclamada en este período. | No |
revision_mismatch | 409 | RevisionMismatch | Un guardado en la nube cambió en otro dispositivo. | No |
rate_limited | 429 | RateLimited | Demasiadas solicitudes por minuto o tiempo de espera de una tabla de clasificación. Espera los segundos que indica Retry-After. | Sí |
quota_exceeded | 429 | QuotaExceeded | Se agotó la cuota diaria de solicitudes de la cuenta; se restablece a las 00:00 UTC. | No |
server_error | 500 | ServerError | Algo falló en el servidor. Los SDK reintentan las solicitudes seguras. | Sí |
Errores exclusivos del SDK#
| Código | HTTP | Unity | Cuándo | ¿Reintentar? |
|---|---|---|---|---|
network | — | Network | No se pudo conectar con el servidor. | Sí |
timeout | — | Timeout | La solicitud superó el tiempo límite. | Sí |
not_configured | — | NotConfigured | Falta la URL base, el ID de proyecto o la clave de cliente, o no son válidos. | No |
not_signed_in | — | NotSignedIn | Una llamada de jugador antes de iniciar sesión o después de que caducara la sesión. | No |
signature_invalid | — | SignatureInvalid | La configuración remota no superó la verificación y no se usó. | No |
parse_error | — | ParseError | No se pudo leer la respuesta (normalmente por un proxy o una página de error HTML). | No |
link_expired | — | LinkExpired | La página de vinculación de cuenta caducó; vuelve a empezar. | No |
link_cancelled | — | LinkCancelled | Se canceló el flujo de vinculación de cuenta. | No |
Gestión de errores#
Muestra message a los desarrolladores, no a los jugadores; decide qué hacer según el código. Reintenta solo los errores reintentables y registra el ID de solicitud para poder encontrar la solicitud en la página Registros.
var top = await Majacloud.Leaderboards.GetTopAsync("coins", 10);
if (top.Ok)
{
foreach (var entry in top.Value.Entries)
Debug.Log($"#{entry.Rank} {entry.PlayerName} {entry.Score}");
}
else if (top.Error.IsRetryable)
{
// Network, timeout, 5xx or rate limit: try again later
Debug.Log("Retry in " + top.Error.RetryAfterSeconds + " s");
}
else
{
Debug.LogWarning(top.Error.Code + ": " + top.Error.Message + " (" + top.Error.RequestId + ")");
}var top := await Majacloud.leaderboards.get_top("coins", 10)
if top.ok:
for entry in top.value.entries:
print("#%d %s %d" % [entry.rank, entry.player_name, entry.score])
elif top.is_retryable():
# Network, timeout, 5xx or rate limit: try again later
print("Retry in ", top.retry_after, " s")
else:
push_warning("%s: %s (%s)" % [top.error, top.message, top.request_id])const top = await mc.leaderboards.getTop('coins', { limit: 10 });
if (top.ok) {
for (const entry of top.value.entries) {
console.log(`#${entry.rank} ${entry.player_name} ${entry.score}`);
}
} else if (top.error.retryable) {
// Network, timeout, 5xx or rate limit: try again later
console.log('Retry in', top.error.retryAfter, 's');
} else {
console.warn(`${top.error.code}: ${top.error.message} (${top.error.requestId})`);
}// Success
{ "ok": true, "entries": [ … ], "total": 42 }
// Error (HTTP 4xx/5xx)
{
"ok": false,
"error": {
"code": "rate_limited",
"message": "Project rate limit reached. Try again in a minute.",
"request_id": "6f1c2a9e-…",
"details": { "limit": 120, "window": "minute" }
}
}