> ## 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.

# 处理 PlayFab 错误

> 处理 PlayFab Services C/C++ SDK 返回的同步、异步、令牌、限流和网络错误,以及常见的 HRESULT 代码。

在 PlayFab Services SDK 中,异步 API 调用有几个不同的失败点。处理这些错误的方式取决于操作失败的方式和时机。

与 GDK 中的大多数异步调用一样,PlayFab API 遵循相同的通用调用模式:

1. **PF\*Async(...)** 调用,启动异步操作。
2. (可选) **XAsyncGetStatus(...)** 调用,用于跟踪异步操作的状态。可用于等待异步操作完成。
3. **PF\*GetResultSize(...)**,用于检索结果有效负载的大小(以字节为单位)。
4. **PF\*GetResult(...)**,用于检索异步操作的结果。

这些调用中的每一个都可能因不同原因而失败。以下部分详细介绍了最常遇到的故障类型。

## 同步失败

同步失败是指初始的 **PF\*Async** 调用返回错误。此类失败通常表明存在编程错误——无效的调用模式、无效的参数等。这些类型的错误应该在开发期间解决。大多数其他同步失败是致命的,无法轻易处理(例如 E\_OUTOFMEMORY)。

## 异步失败

异步失败是指 **XAsyncGetStatus**、**PF\*GetResultSize** 或 **PF\*GetResult** 中的任何一个失败。异步失败的范围更广。除了由于无效参数导致的错误之外,异步失败还分为下面几个部分中详细描述的几个类别。

### 令牌验证失败

在发起 PlayFab 服务调用之前,SDK 会进行客户端验证以确保所需的身份验证令牌可用且仍然有效。如果此检查失败,将返回以下错误之一:

* `E_PF_NOENTITYTOKEN (0x89235411)`:
  表示与提供的 PFEntityHandle 关联的 EntityToken 已过期。有关如何处理这种情况的更多信息,请参阅[处理令牌过期](/services/playfab/sdks/c/relogin)。

* `E_PF_NOSECRETKEY (0x89235412)`
  表示提供的 PFEntityHandle 没有关联的 SecretKey。缺少 SecretKey 通常意味着你尝试使用无效的实体类型发出请求。需要 SecretKey 的 API 只能由游戏实体调用。请注意,SecretKey API 面向服务器或管理员场景,在 GDK 中不可用。

### PlayFab 服务失败

如果 SDK 成功发出 PlayFab 服务请求,服务仍可能返回错误。有两大类 PlayFab 服务错误:*global*(可以从任何 PlayFab API 返回),*specific*(特定于 API)。以下是完整的 *global* 失败列表:

* `E_PF_API_CLIENT_REQUEST_RATE_LIMIT_EXCEEDED (0x892354dd)`
* `E_PF_API_CONCURRENT_REQUEST_LIMIT_EXCEEDED (0x8923556b)`
* `E_PF_CONCURRENT_EDIT_ERROR (0x8923549b)`
* `E_PF_DATA_UPDATE_RATE_EXCEEDED (0x89235534)`
* `E_PF_DOWNSTREAM_SERVICE_UNAVAILABLE (0x89235495)`
* `E_PF_INVALID_API_ENDPOINT (0x89235499)`
* `E_PF_OVER_LIMIT (0x892354ec)`
* `E_PF_SERVICE_UNAVAILABLE (0x89235491)`
* `E_PF_ACCOUNT_BANNED (0x89235423)`
* `E_PF_ACCOUNT_DELETED (0x89235557)`
* `E_PF_ACCOUNT_NOT_FOUND (0x89235422)`
* `E_PF_API_REQUESTS_DISABLED_FOR_TITLE (0x8923553c)`
* `E_PF_INVALID_CONTENT_TYPE (0x892354a6)`
* `E_PF_INVALID_ENTITY_TYPE (0x8923558a)`:
* `E_PF_INVALID_PARAMS (0x89235421)`
* `E_PF_INVALID_REQUEST (0x89235468)`
* `E_PF_INVALID_TITLE_ID (0x89235425)`
* `E_PF_NOT_AUTHENTICATED (0x8923546b)`
* `E_PF_NOT_AUTHORIZED (0x89235478)`
* `E_PF_NOT_AUTHORIZED_BY_TITLE (0x892354d5)`
* `E_PF_PROFILE_DOES_NOT_EXIST (0x8923553f)`
* `E_PF_TITLE_DELETED (0x89235570)`
* `E_PF_UNKNOWN_ERROR (0x89235448)`

有关服务失败重试指南的更多信息,请参阅 [PlayFab 服务全局 API 方法错误代码](/services/playfab/api-references/global-api-method-error-codes)。

#### 限流失败

一类服务失败是限流错误,由 HTTP 429 状态代码指示。当 PlayFab 服务返回限流错误时,意味着客户端在特定时间段内调用某个端点的频率过高。当 SDK 收到限流错误时,它将在小的回退后自动重试请求。如果请求在配置的重试窗口内仍未成功,则该错误将传递给游戏。SDK 重试设置可以通过调用 **PFSetHttpRetrySettings** 进行配置。

### 网络失败

如果底层网络堆栈返回错误,则该错误将传递给客户端。根据网络故障,可能会发生各种错误。大多数网络错误都会导致 `E_HC_NO_NETWORK (0x89235006)`。

## 其他错误详情和跟踪

除了 HRESULT 之外,PlayFab 服务有时还会返回 *errorDetails* 字符串。此字符串不会暴露给最终客户端,但在开发和调试期间可能很有用。要了解如何启用详细跟踪以查看返回的 *errorDetails* 字符串,请参阅[跟踪指南](/services/playfab/sdks/c/tracing)。

## 参考

\[Microsoft Game Development Kit 中的错误处理]\[/gaming/gdk/\_content/gc/system/overviews/error-handling]


## Related topics

- [PFAccountManagementClientGetPlayFabIDsFromGooglePlayGamesPlayerIDsGetResult](/zh-CN/services/playfab/api-references/c/pfaccountmanagement/functions/pfaccountmanagementclientgetplayfabidsfromgoogleplaygamesplayeridsgetresult.md)
- [PFAccountManagementClientGetPlayFabIDsFromGooglePlayGamesPlayerIDsGetResultSize](/zh-CN/services/playfab/api-references/c/pfaccountmanagement/functions/pfaccountmanagementclientgetplayfabidsfromgoogleplaygamesplayeridsgetresultsize.md)
- [PFAccountManagementClientGetPlayFabIDsFromGoogleIDsGetResult](/zh-CN/services/playfab/api-references/c/pfaccountmanagement/functions/pfaccountmanagementclientgetplayfabidsfromgoogleidsgetresult.md)
- [PFAccountManagementClientGetPlayFabIDsFromKongregateIDsGetResult](/zh-CN/services/playfab/api-references/c/pfaccountmanagement/functions/pfaccountmanagementclientgetplayfabidsfromkongregateidsgetresult.md)
- [PFAccountManagementClientGetPlayFabIDsFromFacebookIDsGetResult](/zh-CN/services/playfab/api-references/c/pfaccountmanagement/functions/pfaccountmanagementclientgetplayfabidsfromfacebookidsgetresult.md)
