Fehlercodes
Jeder Fehler hat einen stabilen Code. Die SDKs verwenden dieselben Codes (Unity als Enum) sowie einige weitere für Probleme, die auftreten, bevor eine Anfrage den Server erreicht.
Codekommentare und API-Namen bleiben auf Englisch, damit sie zu den SDKs passen.
Auf dieser Seite
API-Fehler#
| Code | HTTP | Unity | Wann | Wiederholen? |
|---|---|---|---|---|
validation | 400, 422 | Validation | Ungültige Eingabe; details.fields nennt das Feld. | Nein |
unauthorized | 401 | Unauthorized | Falsche Schlüssel oder ein fehlendes, abgelaufenes oder widerrufenes Spieler-Token. | Nein |
forbidden | 403 | Forbidden | Gesperrtes Projekt, ein reiner Server-Endpunkt oder HTTPS erforderlich. | Nein |
plan_limit | 403 | PlanLimit | Ein Tariflimit wurde erreicht (Spieler, Einträge, Speicher …). Es wird nichts gelöscht. | Nein |
not_found | 404 | NotFound | Unbekannter Endpunkt, unbekannte Bestenliste, unbekannter Spieler oder Speicherschlüssel. | Nein |
conflict | 409 | Conflict | Bereits erledigt, z. B. eine in diesem Zeitraum schon abgeholte Belohnung. | Nein |
revision_mismatch | 409 | RevisionMismatch | Ein Cloud-Speicherstand wurde auf einem anderen Gerät geändert. | Nein |
rate_limited | 429 | RateLimited | Zu viele Anfragen pro Minute oder ein Bestenlisten-Cooldown. Warten Sie Retry-After Sekunden. | Ja |
quota_exceeded | 429 | QuotaExceeded | Das tägliche Anfragekontingent des Kontos ist aufgebraucht; es wird um 00:00 UTC zurückgesetzt. | Nein |
server_error | 500 | ServerError | Auf dem Server ist ein Fehler aufgetreten. Sichere Anfragen wiederholen die SDKs automatisch. | Ja |
Reine SDK-Fehler#
| Code | HTTP | Unity | Wann | Wiederholen? |
|---|---|---|---|---|
network | — | Network | Der Server war nicht erreichbar. | Ja |
timeout | — | Timeout | Die Anfrage hat länger als das Timeout gedauert. | Ja |
not_configured | — | NotConfigured | Basis-URL, Projekt-ID oder Client-Schlüssel fehlt oder ist ungültig. | Nein |
not_signed_in | — | NotSignedIn | Ein Spieleraufruf vor der Anmeldung oder nach Ablauf der Sitzung. | Nein |
signature_invalid | — | SignatureInvalid | Die Remote-Konfiguration hat die Prüfung nicht bestanden und wurde nicht verwendet. | Nein |
parse_error | — | ParseError | Die Antwort konnte nicht gelesen werden (meist ein Proxy oder eine HTML-Fehlerseite). | Nein |
link_expired | — | LinkExpired | Die Seite zur Kontoverknüpfung ist abgelaufen; starten Sie neu. | Nein |
link_cancelled | — | LinkCancelled | Die Kontoverknüpfung wurde abgebrochen. | Nein |
Fehlerbehandlung#
Zeigen Sie message Entwicklern, nicht Spielern; verzweigen Sie anhand des Codes. Wiederholen Sie nur wiederholbare Fehler und protokollieren Sie die Anfrage-ID, damit Sie die Anfrage auf der Seite Logs wiederfinden.
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" }
}
}