エラーハンドリングの実装パターン
GS2 を使用したゲーム開発における、実践的なエラーハンドリングとリトライ戦略のベストプラクティス
GS2 が応答するエラーは一定の法則を持って応答されます。 法則を理解することで、エラーの解消が迅速に行えるようになります。
エラーメッセージの例
[{"component":"progress","message":"quest.progress.progress.error.notFound"}]| セクション | 説明 |
|---|---|
| component | エラーが発生した対象を示し、メンバー名、メソッド名が入ります。 |
| message | エラー箇所の詳細、エラーを表すキーワードが入ります。 サービス名.コンポーネント.error.エラー内容 |
| 主要なエラー内容 | 説明 |
|---|---|
| failed | 処理に失敗しました。 |
| invalid | 不正なパラメータです。 |
| require | 必要な引数がありません。 |
| tooLong | 引数の文字数が長すぎます。 |
| tooMany | 配列の要素数が多すぎます。 |
| exists | 既に存在しています。 |
| duplicate | 重複、既に存在しています。 |
| notFound | 見つかりませんでした。 |
| notMatch | 合致しませんでした。 |
SDK によってエラーはある程度分類され、送出される例外の型が変化します。
すべての例外は Gs2Exception を継承しており、以下のプロパティを参照することでリトライの要否を判断できます。
| 例外 | エラー内容 | ステータスコード | RecommendRetry | RecommendAutoRetry |
|---|---|---|---|---|
| BadRequestException | リクエストの内容が不正です。 | 400 | ||
| UnauthorizedException | 権限の認証ができませんでした。 | 401 | ||
| QuotaLimitExceededException | クォータの制限を超えました。 | 402 | ✔︎ | |
| NotFoundException | 対象が見つかりませんでした。 | 404 | ||
| ConflictException | 処理が衝突しました。 | 409 | ✔︎ | |
| InternalServerErrorException | サーバーでエラーが発生しました。 | 500 | ✔︎ | ✔︎ |
| BadGatewayException | サーバーが無効なレスポンスを受け取りました。 | 502 | ✔︎ | ✔︎ |
| ServiceUnavailableException | サービスで一時的なエラーが発生しました。 | 503 | ✔︎ | ✔︎ |
| RequestTimeoutException | リクエストがタイムアウトしました。 | 504 | ✔︎ | ✔︎ |
| UnknownException | 不明な例外が発生しました。 |
RecommendRetry が true の例外は、リクエストパラメータは正常だが、サーバーの状態によって発生する可能性があるエラーです。
このようなエラーを検知した場合、リトライすることを推奨します。
その際に成功するまでリトライするのではなく、一定回数や一定時間の経過でタイムアウトする実装を入れることを強く推奨します。 リトライをする際に、リクエスト間にスリープを入れることを推奨しており、リトライ回数に応じてスリープの長さを伸ばしていくことを推奨します。
ゲーム内でハンドリングを必要とするエラーについては、マイクロサービスごとに列挙した例外を継承したエラー固有の例外型を定義しているものがあります。 その場合、エラー固有の例外でエラーハンドリングをすることでより簡単にエラーハンドリングを実装できます。 固有のエラーを表現する例外が存在する場合、APIリファレンスのメソッドの説明に記載がありますので、そちらをご参照ください。
GS2-CSharp-SDK、GS2 SDK for Unityでは、接続に使用しているゲームエンジン/フレームワークで発生したエラー内容のメッセージの取得が可能です。
| 例外 | エラー内容 | ステータスコード |
|---|---|---|
| NoInternetConnectionException | インターネットの接続に失敗しました。 ※端末が機内モード/圏外/ルータに繋がっているが外に出られない等で、ソケット確立や DNS 解決に失敗したときの 接続エラーを含みます。 | 0 |
| ConnectionException | (Unityのみ) サーバーとの通信に失敗しました。 リクエストが接続できなかった、セキュリティで保護されたチャネルを確立できなかったなど。 | 0 |
| DataProcessingException | (Unityのみ) データ処理中にエラーが発生しました。 | 0 |
| HttpRequestException | (.netのみ) HttpRequestでエラーが発生しました。 | 0 |
GS2 C# SDK および GS2 SDK for Unity にはカオスモードが搭載されています。 カオスモードを有効化すると、指定した割合でリトライが必要な例外をランダムに発します。
開発をカオスモードを有効にした状態で進めることで、ゲーム内のエラーハンドリングをより強固なものにすることができます。 カオスモードの有効化の方法は 初期化処理 を参照してください。
より具体的な実装方法やベストプラクティスについては、エラーハンドリングの実装パターン を参照してください。
GS2 を使用したゲーム開発における、実践的なエラーハンドリングとリトライ戦略のベストプラクティス