> ## Documentation Index
> Fetch the complete documentation index at: https://devdocs.xbox.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Handling common error cases

> チケットのキャンセル、タイムアウト、無効な属性、マッチ作成の失敗など、タイトルで発生する PlayFab マッチメイキングの一般的なエラー ケースへの対処方法。

PlayFab マッチメイキングは、マッチメイキングへの参加と退出のためのシンプルなインターフェースを提供します。それでも、計画どおりにいかない可能性のあるポイントは複数あります。以下では、より一般的なエラー ケースのいくつかと、タイトルが対処する方法を示します。

このページでは、PlayFab マッチメイキングの一般的なフローに精通していることを前提としています。マッチメイキングの一般的な使用方法の詳細については、[マッチメイキング クイックスタート](/services/playfab/multiplayer/matchmaking/quickstart) を参照してください。

## チケット作成時のエラー

チケットの作成は、さまざまな理由で失敗する可能性があります。ほとんどの場合、PlayFab エラー コードが送信要求に関する無効な内容を識別します。これを修正することで、正常に送信できます。

<Note>
  エラー `MatchmakingAttributeInvalid` および `MatchmakingPlayerAttributesInvalid` は、属性のフォーマットに関する問題を示します。チケット内で属性を渡す方法の詳細については、[チケット属性の指定](/services/playfab/multiplayer/matchmaking/ticket-attributes) セクションを参照してください。
</Note>

その他のエラー コードは、要求は有効であるが、要求以外の状況によりチケットが受理されないことを示します。特に以下があります。

1. `MatchmakingRateLimitExceeded` - チケットの送信頻度が高すぎることを示します。詳細については、[以下](#call-returns-matchmakingratelimitexceeded) のセクションを参照してください。
2. `MatchmakingTicketMembershipLimitExceeded` - ユーザーがすでに別のアクティブなチケットに参加していることを示します。ユーザーは 2 つのゲームを同時にプレイできないため、キュー内で同時に複数のチケットに参加することは制限されています。この状況を修正する方法の詳細については、[以下](#creating-or-joining-a-ticket-returns-matchmakingticketmembershiplimitexceeded) のより詳細なセクションを参照してください。

HTTP エラー コード 503 を受け取った場合は、短い遅延の後で要求を再試行してください。

## 呼び出しが MatchmakingRateLimitExceeded を返す

他の PlayFab 機能と同様に、PlayFab マッチメイキングは、Game Manager 内で構成された制限に従って、呼び出しの数を制限します。`MatchmakingRateLimitExceeded` エラーを受信することは、タイトルがこの呼び出しタイプの制限を超えたことを示します。

マッチメイキングでは、これは [GetMatchmakingTicket](xref:titleid.playfabapi.com.multiplayer.matchmaking.getmatchmakingticket) をポーリングしてチケットがマッチしたかどうかを確認する際に最もよく発生します。

このエラーを回避するには、制限を増やすか、呼び出し頻度を減らしてください。

<Note>
  応答の HTTP ステータス コードは 429 ですが、要求自体は有効であり、再試行できます。
</Note>

## チケットの作成または参加が MatchmakingTicketMembershipLimitExceeded を返す

PlayFab マッチメイキングでは、ユーザーが 2 つのマッチに参加してどちらのチケットを尊重するかを決めなければならない状況を避けるため、ユーザーはキューごとに一度に 1 つのチケットにしか参加できません。尊重されない方のマッチは 1 人プレイヤーが不足することになり、そのプレイヤーはマッチメイキングに再度参加する必要が生じる可能性が高くなります。ユーザーがキャンセルもマッチもされていないチケットに既に参加している状態で別のチケットを作成または参加しようとすると、`MatchmakingTicketMembershipLimitExceeded` エラーが返されます。

しかし、タイトルやサーバーがクラッシュ、再起動、その他の予期しないエラーなどにより、チケットを見失うことがあります。これが発生すると、ユーザーもタイトルも認識していないアクティブなチケットが残されます。

この失われたチケットは、有効期限が切れるまで、このユーザーの今後のチケットの送信を妨げます。これが発生した場合、問題を解決するための 2 つの選択肢があります。

### オプション 1: マッチメイキングからチケットを削除する

ユーザーの既存のチケットをすべてキャンセルします。[CancelAllMatchmakingTicketsForPlayer](xref:titleid.playfabapi.com.multiplayer.matchmaking.cancelallmatchmakingticketsforplayer) を呼び出すと、このタスクを実行できます。その後、マッチメイキングには処理中のチケットが存在しなくなり、新しいチケットの作成準備が整います。

### オプション 2: 失われたチケットを見つける

ユーザーの既存のチケットを見つけて使用し続けます。[ListMatchmakingTicketsForPlayer](xref:titleid.playfabapi.com.multiplayer.matchmaking.listmatchmakingticketsforplayer) を呼び出すと、そのユーザーがメンバーであるすべてのマッチメイキング チケット ID が返されます。提供された各 ticketId に対して [GetMatchmakingTicket](xref:titleid.playfabapi.com.multiplayer.matchmaking.getmatchmakingticket) を呼び出すことで、その状態を取得し、マッチが見つかるまでモニタリングを継続できます。

## マルチ ユーザー チケットに全プレイヤーが参加しない

マルチ ユーザー チケットを作成するとき、招待されたプレイヤーの 1 人が失敗する、または参加を拒否することがあります。このような場合、作成されたチケットは有効期限が切れるまで WaitingForPlayers ステータスのままになります。タイトルはこの状況が時々発生することを想定し、UI 内でかなり短いタイムアウトを設定するべきです。

そのタイムアウト後、タイトルはチケットをキャンセルし、すべてのプレイヤーが依然として一緒にゲームをプレイすることに同意しているかを確認する必要があります。

## GetMatch が not found を返す

マッチが作成されると、マッチは一定期間存続し、最終的に期限切れになります。マッチが時間内に取得されない場合、それらのユーザーは再度マッチさせるためにチケットを再送信する必要があります。マッチが適切なタイミング (数分以内) で取得されるようにすることで、これを回避できます。

[こちら](/services/playfab/multiplayer/lobby/lobby-and-matchmaking) で説明されているように、マッチメイキングとロビーを一緒に使用している場合、マッチがここでタイムアウトしてから一定期間 lobbyArrangementString が有効なままである可能性があります。期限が切れる前に GetMatch から情報を取得して使用するようにしてください。

## チケットがキャンセルされる

チケットは複数の理由でキャンセルされることがあります。最も一般的なケースは、ユーザーによるキャンセルとチケットの有効期限切れですが、サーバーによってもチケットをキャンセルできます。`GetMatchmakingTicket` を呼び出してチケットがキャンセルされていることが判明した場合、その理由は `CancellationReason` フィールドに記載されています。使用可能な `CancellationReason` 応答と、対応する解決策を以下に示します。

| CancellationReason     | 説明                                           | 解決策                                        |
| ---------------------- | -------------------------------------------- | ------------------------------------------ |
| User                   | ユーザーがマッチメイキング チケットをキャンセル                     | 意図的。必要に応じて新しいチケットを作成する。                    |
| Server                 | サーバー API を通じてサービスがマッチメイキング チケットをキャンセル        | 意図的。必要に応じて新しいチケットを作成する。                    |
| Timeout                | GiveUpAfterSeconds に達してチケットが期限切れになった         | 新しいチケットで再試行し、必要に応じてチケット属性を調整する。            |
| ServerAllocationFailed | キューがサーバーを割り当てるが、割り当て要求が失敗した                  | リージョンにスタンバイ サーバーがあることを確認し、新しいチケットで再試行する。   |
| TicketUnmatchable      | チケット パラメータとキューのルールの組み合わせにより、このチケットがマッチ不可能である | チケット属性またはキュー構成のいずれかを、互換性があるように調整する。        |
| RetryRequired          | 内部の一時的なマッチメイキング エラー                          | 新しいチケットで再試行する。次回の要求では解決するタイミングの問題であることが多い。 |
| Internal               | 内部のマッチメイキング サービス エラー                         | 新しいチケットで再試行する。                             |

## チケットのキャンセルがエラーを返す

チケットのキャンセルは必ず成功するとは限りません。ほとんどのエラーは自明ですが、`MatchmakingTicketAlreadyCompleted` エラーは、以下の 2 つの可能性のうちいずれかを示します。

1. チケットは既にキャンセルされている。
2. チケットは既にマッチされている。

このエラーを受け取ったら、タイトルは [GetMatchmakingTicket](xref:titleid.playfabapi.com.multiplayer.matchmaking.getmatchmakingticket) を呼び出してこれら 2 つのケースを区別する必要があります。最初のケースでは、チケットは既に望ましい状態にあり、それ以上のアクションは必要ありません。2 つ目のケースは、ユーザーのキャンセルが遅すぎて既にマッチしていることを示します。ユーザーのキャンセルとマッチが見つかることの間の競合状態は避けられず、タイトルで処理する必要があります。

タイトルにはこの問題を解決するための 2 つの選択肢があります。ユーザーのキャンセル要求を無視してマッチに参加させるか、プレイヤーが参加しないことを承知でマッチを開始させるかです。どちらの選択肢も完璧ではありませんが、この状況が発生することを想定し、意図的なタイトル フローを作成することが重要です。また、プレイヤーがさまざまな理由でマッチに参加しない可能性があるため、タイトルはここで述べた競合状態に関係なくこのケースを処理する必要があることも留意すべきです。
