例外の処理

Version:
日本語翻訳に関する免責事項

このページの翻訳はAIによって自動的に行われました。可能な限り正確な翻訳を心掛けていますが、原文と異なる表現や解釈が含まれる場合があります。正確で公式な情報については、必ず英語の原文をご参照ください。

このトピックでは、xConnectによって返される可能性のある例外と、その例外が発生する可能性がある場合について説明します。

XdbUnavailableExceptionの

XdbUnavailableException例外は、xConnectサービスが利用できないか、リクエストがタイムアウトしたことを示します。XdbCollectionUnavailableException例外とXdbSearchUnavailableException例外はどちらもXdbUnavailableExceptionを継承します。

XdbExecutionExceptionの

xConnectは、バッチ内の1つ以上の操作の実行に失敗した場合にXdbExecutionExceptionをスローします。 client.GetOperations() を使用して、失敗した特定の操作を選択します。次の例では、PhoneNumberListファセットがすでに存在するために失敗した操作を選択します。

using Sitecore.XConnect.Collection.Model;
using Sitecore.XConnect.Operations;
using System;
using System.Threading.Tasks;
using System.Linq;
using Sitecore.XConnect;
using Sitecore.XConnect.Client;


namespace Documentation
{
    public class CatchingExceptions
    {
        public async void ExampleAsync()
        {
            using (Sitecore.XConnect.Client.XConnectClient client = Sitecore.XConnect.Client.Configuration.SitecoreXConnectClientConfiguration.GetClient())
            {
                try
                {
                    // Get contact
                    var reference = new Sitecore.XConnect.ContactReference(Guid.Parse("B9814105-1F45-E611-82E6-34E6D7117DCB"));

                    Task<Sitecore.XConnect.Contact> contactTask = client.GetAsync<Sitecore.XConnect.Contact>(reference, new ContactExecutionOptions(new Sitecore.XConnect.ContactExpandOptions(Sitecore.XConnect.Collection.Model.CollectionModel.FacetKeys.PhoneNumberList) { }));

                    Sitecore.XConnect.Contact contact = await contactTask;

                    // Update some properties on an existing facet
                    PhoneNumberList phoneNumberList = contact.PhoneNumbers();

                    phoneNumberList.PreferredKey = "Work";
                    phoneNumberList.PreferredPhoneNumber = new PhoneNumber("44", "55555555") { Extension = "1234" };

                    // Set updated facet
                    client.SetPhoneNumbers(contact, phoneNumberList);

                    // Submit changes
                    await client.SubmitAsync();
                }
                catch (XdbExecutionException ex)
                {
                    // Get any operations that failed
                    var operations = ex.GetOperations(client)
                        .Where(x => x.Status == XdbOperationStatus.Failed);

                    foreach (var ops in operations)
                    {
                        if (ops is SetFacetOperation<PhoneNumberList>)
                        {
                            var phoneOps = ops as SetFacetOperation<PhoneNumberList>;

                            if (phoneOps.Result.Status == SaveResultStatus.AlreadyExists)
                            {
                                // LOG: This contact already has a PhoneNumberList facet
                            }
                        }
                    }
                }
            }
        }

        public void ExampleSync()
        {
            using (Sitecore.XConnect.Client.XConnectClient client = Sitecore.XConnect.Client.Configuration.SitecoreXConnectClientConfiguration.GetClient())
            {
                try
                {
                    // Get contact
                    var reference = new Sitecore.XConnect.ContactReference(Guid.Parse("B9814105-1F45-E611-82E6-34E6D7117DCB"));

                    Contact contact = client.Get<Sitecore.XConnect.Contact>(reference, new ContactExecutionOptions(new Sitecore.XConnect.ContactExpandOptions(Sitecore.XConnect.Collection.Model.CollectionModel.FacetKeys.PhoneNumberList) { }));

                    // Update some properties on an existing facet
                    PhoneNumberList phoneNumberList = contact.PhoneNumbers();

                    phoneNumberList.PreferredKey = "Work";
                    phoneNumberList.PreferredPhoneNumber = new PhoneNumber("44", "55555555") { Extension = "1234" };

                    // Set updated facet
                    client.SetPhoneNumbers(contact, phoneNumberList);

                    // Submit changes
                    client.Submit();
                }
                catch (XdbExecutionException ex)
                {
                    // Get any operations that failed
                    var operations = ex.GetOperations(client)
                        .Where(x => x.Status == XdbOperationStatus.Failed);

                    foreach (var ops in operations)
                    {
                        if (ops is SetFacetOperation<PhoneNumberList>)
                        {
                            var phoneOps = ops as SetFacetOperation<PhoneNumberList>;

                            if (phoneOps.Result.Status == SaveResultStatus.AlreadyExists)
                            {
                                // LOG: This contact already has a PhoneNumberList facet
                            }
                        }
                    }
                }
            }
        }
    }
}
  • Statusプロパティは、すべての操作で使用できます (XdbOperationStatus.Failed、操作が失敗したことを示します)

  • Result.StatusプロパティはSetFacetOperation操作とAddContactIdentifier操作で使用できます - 接続エラーによって操作の実行が妨げられた場合、Resultプロパティはnullになることがあります

  • すべての操作には、ネストされたExceptionプロパティがあります

XdbExecutionExceptionの後に操作を再試行する

失敗した操作を再試行するには、client.RegisterOperation() メソッドを使用してクライアントに追加し、バッチを再送信します。これは、接続の問題が原因で操作が失敗した場合に便利です。

メモ

同時実行の問題が原因で操作が失敗した場合は、同時実行 のトピックを参照してください。

次の例では、xConnectが1つ以上の操作が失敗したことを示すXdbExecutionExceptionを返した後、操作が再試行されます。

catch (XdbExecutionException ex)
{
    // Get any operations that failed
    var operations = ex.GetOperations(client)
        .Where(x => x.Status == XdbOperationStatus.Failed);

    foreach (var ops in operations)
    {
        client.RegisterOperation(ops);
    }

    await client.SubmitAsync();
}
この記事を改善するための提案がある場合は、 お知らせください!