Codes d'erreur
Chaque erreur a un code stable. Les SDK utilisent les mêmes codes (sous forme d'enum dans Unity), plus quelques-uns pour les problèmes qui surviennent avant qu'une requête n'atteigne le serveur.
Les commentaires du code et les noms d'API restent en anglais pour correspondre aux SDK.
Sur cette page
Erreurs de l'API#
| Code | HTTP | Unity | Quand | Réessayer ? |
|---|---|---|---|---|
validation | 400, 422 | Validation | Entrée invalide ; details.fields indique le champ concerné. | Non |
unauthorized | 401 | Unauthorized | Clés incorrectes, ou jeton joueur manquant, expiré ou révoqué. | Non |
forbidden | 403 | Forbidden | Projet suspendu, endpoint réservé aux serveurs, ou HTTPS requis. | Non |
plan_limit | 403 | PlanLimit | Une limite de l'offre a été atteinte (joueurs, entrées, stockage…). Rien n'est supprimé. | Non |
not_found | 404 | NotFound | Endpoint, classement, joueur ou clé de sauvegarde inconnu. | Non |
conflict | 409 | Conflict | Déjà fait, par ex. une récompense déjà réclamée pendant cette période. | Non |
revision_mismatch | 409 | RevisionMismatch | Une sauvegarde cloud a été modifiée sur un autre appareil. | Non |
rate_limited | 429 | RateLimited | Trop de requêtes par minute, ou délai entre envois d'un classement non respecté. Attendez Retry-After secondes. | Oui |
quota_exceeded | 429 | QuotaExceeded | Le quota quotidien de requêtes du compte est épuisé ; il se réinitialise à 00:00 UTC. | Non |
server_error | 500 | ServerError | Une erreur s'est produite sur le serveur. Les SDK relancent les requêtes sûres. | Oui |
Erreurs propres aux SDK#
| Code | HTTP | Unity | Quand | Réessayer ? |
|---|---|---|---|---|
network | — | Network | Le serveur n'a pas pu être joint. | Oui |
timeout | — | Timeout | La requête a dépassé le délai d'expiration. | Oui |
not_configured | — | NotConfigured | URL de base, ID du projet ou clé client manquant ou invalide. | Non |
not_signed_in | — | NotSignedIn | Un appel joueur avant la connexion, ou après l'expiration de la session. | Non |
signature_invalid | — | SignatureInvalid | La configuration à distance n'a pas passé la vérification et n'a pas été utilisée. | Non |
parse_error | — | ParseError | La réponse n'a pas pu être lue (généralement à cause d'un proxy ou d'une page d'erreur HTML). | Non |
link_expired | — | LinkExpired | La page de liaison de compte a expiré ; recommencez. | Non |
link_cancelled | — | LinkCancelled | Le flux de liaison de compte a été annulé. | Non |
Gérer les erreurs#
Affichez message aux développeurs, pas aux joueurs ; basez votre logique sur le code. Ne relancez que les erreurs qui le permettent, et journalisez l'ID de requête pour retrouver la requête sur la page Journaux.
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" }
}
}