Kode error
Setiap error punya kode tetap. SDK memakai kode yang sama (Unity sebagai enum), ditambah beberapa kode untuk masalah yang terjadi sebelum request sampai ke server.
Komentar kode dan nama API tetap dalam bahasa Inggris agar sesuai dengan SDK.
Di halaman ini
Error API#
| Kode | HTTP | Unity | Kapan | Coba ulang? |
|---|---|---|---|---|
validation | 400, 422 | Validation | Input tidak valid; details.fields menyebutkan field-nya. | Tidak |
unauthorized | 401 | Unauthorized | Key salah, atau token pemain tidak ada, kedaluwarsa, atau sudah dicabut. | Tidak |
forbidden | 403 | Forbidden | Project ditangguhkan, endpoint khusus server, atau HTTPS wajib. | Tidak |
plan_limit | 403 | PlanLimit | Batas paket tercapai (pemain, entri, penyimpanan…). Tidak ada yang dihapus. | Tidak |
not_found | 404 | NotFound | Endpoint, leaderboard, pemain, atau key save tidak dikenal. | Tidak |
conflict | 409 | Conflict | Sudah dilakukan, mis. reward sudah diklaim pada periode ini. | Tidak |
revision_mismatch | 409 | RevisionMismatch | Cloud save berubah di perangkat lain. | Tidak |
rate_limited | 429 | RateLimited | Terlalu banyak request per menit, atau jeda leaderboard. Tunggu selama Retry-After detik. | Ya |
quota_exceeded | 429 | QuotaExceeded | Kuota request harian akun sudah habis; direset pukul 00:00 UTC. | Tidak |
server_error | 500 | ServerError | Terjadi kegagalan di server. Request yang aman diulang otomatis oleh SDK. | Ya |
Error khusus SDK#
| Kode | HTTP | Unity | Kapan | Coba ulang? |
|---|---|---|---|---|
network | — | Network | Server tidak dapat dijangkau. | Ya |
timeout | — | Timeout | Request melebihi batas waktu. | Ya |
not_configured | — | NotConfigured | Base URL, Project ID, atau client key tidak ada atau tidak valid. | Tidak |
not_signed_in | — | NotSignedIn | Panggilan pemain sebelum login, atau setelah sesi kedaluwarsa. | Tidak |
signature_invalid | — | SignatureInvalid | Remote config gagal diverifikasi dan tidak dipakai. | Tidak |
parse_error | — | ParseError | Respons tidak dapat dibaca (biasanya karena proxy atau halaman error HTML). | Tidak |
link_expired | — | LinkExpired | Halaman penautan akun sudah kedaluwarsa; mulai lagi. | Tidak |
link_cancelled | — | LinkCancelled | Alur penautan akun dibatalkan. | Tidak |
Menangani error#
Tampilkan message untuk developer, bukan untuk pemain; tentukan tindakan berdasarkan kodenya. Ulangi hanya error yang bisa dicoba ulang, dan catat request ID agar Anda bisa menemukan request-nya di halaman Log.
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" }
}
}