在 CloudScript 中处理错误

本教程介绍如何在 CloudScript 处理程序中识别和处理错误。

识别

第一步是识别错误。 记录每个未捕获的错误并可从对调用方(客户端)的响应中获取,但可以使用 try/catch 块尽早捕获错误。

考虑生成并捕获错误的以下 CloudScript 片段。

"use strict";

handlers.GenerateError = () => {
    try {
        server.GetPlayerStatistics({
            PlayFabId : "non-existing-player-id"
        });
    } catch (ex) {
        let error = ex.apiErrorInfo.apiError.error; // In this case - "InvalidParams"
        let errorCode = ex.apiErrorInfo.apiError.errorCode; // In this case : 1000
    }
}

请注意如何在 catch 块中提取错误代码。 请参阅我们的全局 API 方法错误代码文档,以获取完整错误列表。

注意

通过错误代码本身足以识别错误。

日志记录

任何未处理的错误都添加到响应中,从而允许客户端处理问题。

同时,它会创建 CloudScript 错误条目,并将其添加到 CloudScript 仪表板上可用的总统计信息中。

游戏管理器 - 显示 API 错误图的 CloudScript 仪表板

若要强制以 JSON 字符串的形式记录异常,请通过 log 对象使用错误日志记录。

"use strict";

handlers.GenerateError = () => {
    try {
        server.GetPlayerStatistics({
            PlayFabId : "non-existing-player-id"
        });
    } catch (ex) {
        log.error(ex);
    }
}

最后,可以编写游戏/玩家事件,以便以后通过分析进行处理。

"use strict";

handlers.GenerateError = () => {
    try {
        server.GetPlayerStatistics({
            PlayFabId : "non-existing-player-id"
        });
    } catch (ex) {
        server.WriteTitleEvent({
            EventName : 'cs_error',
            Body : ex
        });
    }
}

恢复

并非总是可以从错误中恢复。 InvalidArguments等问题使你无法选择向玩家报告问题。

可以对部分错误应用重试策略。 可重试 的错误类型在全局 API 方法错误代码教程中进行了介绍。

要求确保 在应用重试策略时满足以下要求:

  • 对于每次重试,重试之间的延迟应以指数倍增加。 这会增加成功调用的可能性,并防止游戏向 PlayFab 服务器发送垃圾邮件(这会导致更多 调用被拒绝)。

  • 应该选择性 地应用此重试策略,只将它用于值得重试的代码。

CloudScript 超时错误

CloudScript API 调用的执行时间限制为 4 秒。

如果执行时间超过 4 秒,则会引发 InternalServerError ,PlayStream 事件将写入类似于以下内容的 Logs 对象:

    "Logs":[
        {
        "Level":"Error",
        "Message":"PlayFab API request failure",
        "Data":{
            "request":{
                "PlayFabId":"9437A5ADDAE3012D"
            },
            "error":"Timeout",
            "api":"/Server/GetPlayerSegments"
        }
        }
    ]

如果遇到此错误,可以:

  • 将 CloudScript 拆分为较小的代码段,这些代码段将在 4 秒内运行。
  • 使用 Azure Functions 切换到 CloudScript,它在某些情况下有更长的超时限制。 可以在快速入门指南中查看限制。