> ## Documentation Index
> Fetch the complete documentation index at: https://devdocs.xbox.com/llms.txt
> Use this file to discover all available pages before exploring further.

# CloudScript でのエラー処理

> try/catch ブロックを使って PlayFab CloudScript のエラーをキャッチして調査し、API エラー コードを抽出し、CloudScript ダッシュボードから未処理のエラーを監視します。

このチュートリアルでは、CloudScript ハンドラー内でエラーを認識して処理する方法について説明します。

## 特定

最初のステップはエラーの特定です。キャッチされていないすべてのエラーはログに記録され、呼び出し元 (クライアント) へのレスポンスから利用できますが、`try/catch` ブロックを使って早期にキャッチすることもできます。

エラーを発生させてキャッチする次の CloudScript スニペットを参照してください。

```javascript theme={null}
"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 メソッド エラー コードのドキュメント](/services/playfab/api-references/global-api-method-error-codes) を参照してください。

<Note>
  エラー コード単独でエラーを特定できます。
</Note>

## ログ記録

未処理のエラーはすべてレスポンスに追加され、クライアントで問題を処理できるようになります。

同時に、CloudScript エラー エントリが作成され、CloudScript ダッシュボードで利用できる合計統計情報に追加されます。

<img src="https://mintcdn.com/microsoft-4404708b/dqv53299jA1M-fNi/images/playfab/live-service-management/service-gateway/automation/cloudscript/tutorials/game-manager-cloudscript-dashboard.png?fit=max&auto=format&n=dqv53299jA1M-fNi&q=85&s=b223b50da990d93023537437490b0ed2" alt="Game Manager - CloudScript Dashboard showing a graph of API errors" width="1366" height="771" data-path="images/playfab/live-service-management/service-gateway/automation/cloudscript/tutorials/game-manager-cloudscript-dashboard.png" />

例外を JSON 文字列の形式で強制的にログに記録するには、`log` オブジェクトを使ったエラー ログを利用します。

```javascript theme={null}
"use strict";

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

最後に、後で分析で処理するためにタイトル/プレイヤー イベントを書き込むこともできます。

```javascript theme={null}
"use strict";

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

## 回復

エラーからの回復は常に可能とは限りません。`InvalidArguments` のような問題では、プレイヤーに問題を報告する以外の選択肢はありません。

再試行戦略を適用できるエラーのサブセットも存在します。*再試行可能* なエラーの種類は [グローバル API メソッド エラー コード](/services/playfab/api-references/global-api-method-error-codes) に記載されています。

再試行戦略を適用する際には、次の要件を必ず *満たしてください*:

* 再試行のたびに、再試行間の遅延は *指数関数的に増加* させる必要があります。これにより、呼び出しが成功する確率が高まり、ゲームが PlayFab サーバーにスパムを送信するのを防ぐことができます (スパム送信は *さらに多くの* 拒否された呼び出しにつながります)。

* この再試行戦略は *選択的に* 適用し、再試行する価値のあるコードにのみ使用してください。

## CloudScript タイムアウト エラー

CloudScript API 呼び出しの実行時間は 4 秒に制限されています。

実行時間が 4 秒を超えると `InternalServerError` が発生し、PlayStream Event は次のような Logs オブジェクトを書き込みます:

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

このエラーが発生した場合は、次のことができます:

* CloudScript を 4 秒未満で実行できる小さなコード セグメントに分割する。
* [Azure Functions を利用した CloudScript](/services/playfab/live-service-management/service-gateway/automation/cloudscript-af/quickstart) に切り替える。この方法は、場合によってタイムアウト制限が長くなります。制限は [クイックスタート ガイド](/services/playfab/live-service-management/service-gateway/automation/cloudscript-af/quickstart#execution-limits) で確認できます。


## Related topics

- [マーケットプレイスのエラー処理](/ja-jp/services/playfab/economy-monetization/economy-v2/marketplace/marketplace-error-handling.md)
- [SDK エラー処理のベスト プラクティス](/ja-jp/services/playfab/live-service-management/service-gateway/automation/cloudscript/sdk-error-handling-best-practices.md)
- [PlayFab ライブ サービス管理ドキュメント](/ja-jp/services/playfab/live-service-management/index.md)
- [カスタム CloudScript の作成](/ja-jp/services/playfab/live-service-management/service-gateway/automation/cloudscript/writing-custom-cloudscript.md)
- [PFCloudScriptServerExecuteCloudScriptGetResult](/ja-jp/services/playfab/api-references/c/pfcloudscript/functions/pfcloudscriptserverexecutecloudscriptgetresult.md)
