Error handling
Learn how to handle errors in your scripts.
Error codes
Cloud Code returns a 422
status error if your script throws an exception.
Use the error code or error type instead of the error message returned from the Cloud Code API error response for your error handling logic. Error messages can change in the future, but the error codes and type remain the same.
Error wrapping
Wrap your code in try/catch
blocks to handle errors.
If an error occurs, you can log it and return an error to the client.
For example, you can use a non wrapped function:
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;
}
The non wrapped function returns an error if any of the API calls fail. However, if you wrap your API calls, you can log out the error message and get more details about the error:
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;
}
}
To check the logs and view the details, open the Unity Cloud Dashboard and select Products > Cloud Code > Logs.
Logging
You can use the logger
object to log errors and warnings to help you debug your scripts.
You can log messages at different levels of severity. These levels can help you query logs in the Unity Cloud Dashboard.
Cloud Code automatically adds attributes such as playerId
, environmentId
and projectId
to the logs for you, so you don't need to add them to your log messages.
JavaScript
logger.debug(message, ...logAttributes)
logger.info(message, ...logAttributes)
logger.warning(message, ...logAttributes)
logger.error(message, ...logAttributes)
logger.fatal(message, ...logAttributes)
You can add custom log attributes to have more context about the log message. For example, you can add the currencyId
to the log message when a call to Economy fails:
JavaScript
logger.error("Failed to increment currency", {"error.message": err.message}, {"currencyId" : params.currencyId});
Navigate to the Unity Cloud Dashboard and select Live Ops > Cloud Code > Logs to view and filter the logs.
Refer to Emit logs for more information.
Debugging on the Unity Cloud Dashboard
You can debug your scripts through the Unity Cloud Dashboard.
Navigate to Cloud Code > Scripts and select the script you want to debug.
The Response tab and the script editor help indicate where errors have occurred.
The Response tab shows the line and column of an error. The debugger uses this information and adds an annotation to visually indicate where the error occurred in the Script Code section.
The error annotation stays visible until you make edits to the script or when you run the script again.
The following is an example of how you can handle and throw an error.
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');
}
}