错误处理
了解如何在脚本中处理错误。
错误代码
如果您的脚本抛出异常,云代码会返回 422
状态错误。
使用错误代码或错误类型而不是从云代码 API 错误响应返回的错误消息来处理您的错误处理逻辑。错误消息将来可能会更改,但错误代码和类型保持不变。
错误包装
将代码包装在 try/catch
块中以处理错误。如果发生错误,您可以记录它并向客户端返回错误。
例如,您可以使用未包装的函数
JavaScript
const { CurrenciesApi } = require("@unity-services/economy-2.4");
module.exports = async ({ params, context, logger }) => {
const { projectId, playerId } = context;
const { currencyId } = params;
const currencies = new CurrenciesApi(context);
const setBalance = await currencies.setPlayerCurrencyBalance({ projectId, playerId, currencyId, currencyBalanceRequest: { balance: 100 } });
const decrement = await currencies.decrementPlayerCurrencyBalance({ projectId, playerId, currencyId, currencyModifyBalanceRequest: { amount: 50 } });
const increment = await currencies.incrementPlayerCurrencyBalance({ projectId, playerId, currencyId, currencyModifyBalanceRequest: { amount: 10 } });
const result = await currencies.getPlayerCurrencies({ projectId, playerId });
return result.data;
}
如果任何 API 调用失败,未包装的函数会返回错误。但是,如果您包装 API 调用,您可以记录错误消息并获取有关错误的更多详细信息
JavaScript
const { CurrenciesApi } = require("@unity-services/economy-2.4");
module.exports = async ({ params, context, logger }) => {
const { projectId, playerId } = context;
const { currencyId } = params;
const currencies = new CurrenciesApi(context);
try {
const setBalance = await currencies.setPlayerCurrencyBalance({ projectId, playerId, currencyId, currencyBalanceRequest: { balance: 100 } });
const decrement = await currencies.decrementPlayerCurrencyBalance({ projectId, playerId, currencyId, currencyModifyBalanceRequest: { amount: 50 } });
const increment = await currencies.incrementPlayerCurrencyBalance({ projectId, playerId, currencyId, currencyModifyBalanceRequest: { amount: 10 } });
const result = await currencies.getPlayerCurrencies({ projectId, playerId });
return result.data;
} catch (err) {
logger.error("Failed to increment currency", {"error.message": err.message}, {"currencyId" : currencyId});
throw err;
}
}
要检查日志并查看详细信息,请打开 Unity 云仪表板 并选择产品>云代码>日志。
日志记录
您可以使用 logger
对象将错误和警告记录到日志中,以帮助您调试脚本。您可以以不同的严重级别记录消息。这些级别可以帮助您在 Unity 云仪表板中查询日志。
云代码会自动为您添加 playerId
、environmentId
和 projectId
等属性到日志中,因此您不需要将它们添加到日志消息中。
JavaScript
logger.debug(message, ...logAttributes)
logger.info(message, ...logAttributes)
logger.warning(message, ...logAttributes)
logger.error(message, ...logAttributes)
logger.fatal(message, ...logAttributes)
您可以添加自定义日志属性以获取有关日志消息的更多上下文。例如,当对 Economy 的调用失败时,您可以在日志消息中添加 currencyId
JavaScript
logger.error("Failed to increment currency", {"error.message": err.message}, {"currencyId" : params.currencyId});
导航到 Unity 云仪表板 并选择实时运营>云代码>日志以查看和筛选日志。
有关更多信息,请参阅 发出日志。
在 Unity 云仪表板中调试
您可以通过 Unity 云仪表板 调试脚本。
导航到云代码>脚本并选择您要调试的脚本。
响应选项卡和脚本编辑器有助于指示错误发生的位置。
响应选项卡显示错误的行和列。调试器使用此信息并在脚本代码部分添加注释,以直观地指示错误发生的位置。
错误注释会一直可见,直到您编辑脚本或再次运行脚本。
以下是处理和抛出错误的示例。
JavaScript
const { CurrenciesApi } = require("@unity-services/economy-2.4");
module.exports = async ({ params, context, logger }) => {
const { playerId, projectId } = context;
const { currencyId } = params;
const currencies = new CurrenciesApi(context);
try {
const setBalance = await currencies.setPlayerCurrencyBalance({
projectId,
playerId,
currencyId,
currencyBalanceRequest: {
balance: 100,
}
});
} catch (err) {
if (err.response) {
logger.error("Failed to set currency", { "error.response": err.response }, {"currencyId": currencyId});
} else {
logger.error("Failed to set currency", { "error.message": err.message }, {"currencyId": currencyId});
}
throw Error('oops');
}
}