在 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 仪表板上可用的总统计信息中。
若要强制以 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,它在某些情况下有更长的超时限制。 可以在快速入门指南中查看限制。