# エラー処理

> Handle errors in your scripts using error codes and custom error-handling logic.

スクリプト内でエラーを処理する方法を説明します。

## エラーコード##error-codes

Cloud Code は、スクリプトが例外をスローした場合に `422` ステータスエラーを返します。

エラー処理ロジックでは、Cloud Code API エラーレスポンスから返されるエラーメッセージのかわりにエラーコードまたはエラータイプを使用します。エラーメッセージは将来変更される可能性がありますが、エラーコードとタイプは同じままになります。

## エラーのラップ##error-wrapping

エラーを処理するにはコードを `try/catch` ブロックにラップします。エラーが発生した場合は、それをログに記録し、クライアントにエラーを返すことができます。

例えば、ラップされない関数を使用できます。

### JavaScript##javascript

```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##javascript

```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 Dashboard](https://cloud.unity.com) を開き、**Products** (製品) > **Cloud Code** > **Logs** (ログ) を選択します。

## ロギング##logging

`logger` オブジェクトを使用してエラーと警告をログに記録し、スクリプトのデバッグに役立てることができます。さまざまなセキュリティレベルでメッセージをログに記録できます。これらのレベルは Unity Dashboard でログをクエリするのに役立ちます。

Cloud Code では、`playerId`、`environmentId`、`projectId` などの属性がログに自動的に追加されるため、それらをログメッセージに追加する必要はありません。

### JavaScript##javascript

```javascript
logger.debug(message, ...logAttributes)
logger.info(message, ...logAttributes)
logger.warning(message, ...logAttributes)
logger.error(message, ...logAttributes)
logger.fatal(message, ...logAttributes)
```

カスタムログ属性を追加して、ログメッセージついてより多くのコンテキストを持つことができます。例えば、Economy の呼び出しが失敗した場合、`currencyId` をログメッセージに追加できます。

### JavaScript##javascript

```javascript
logger.error("Failed to increment currency", {"error.message": err.message}, {"currencyId" : params.currencyId});
```

[Unity Dashboard](https://cloud.unity.com) に移動し、**Cloud Code** > **Logs** (ログ) を選択して、ログの表示とフィルター処理を行います。

詳細については、[ログの発行](../../logging/tutorials/emit-logs#cloud-code-javascript-scripts) を参照してください。

## Unity Dashboard でのデバッグ##debugging-on-the-unity-dashboard

[Unity Dashboard](https://cloud.unity.com) を使用してスクリプトをデバッグできます。

**Cloud Code** > **Scripts** (スクリプト) に移動し、デバッグするスクリプトを選択します。

Response (レスポンス) タブとスクリプトエディターは、エラーが発生した場所を示すのに役立ちます。

Response (レスポンス) タブには、エラーの行と列が表示されます。デバッガーは、この情報を使用し、注釈を追加して、エラーが発生した場所を Script Code (スクリプトコード) セクションで視覚的に示します。


**Frame:**
![](/api/media?file=/cloud-code/media/images/cloud-code-debugging.png)

エラーの注釈は、スクリプトに編集を行うか、スクリプトを再度実行するまで表示されたままになります。

以下は、エラーを処理およびスローする方法の例です。

### JavaScript##javascript

```js
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');
  }

}
```
