---
title: "例外の処理"
slug: "handling-exceptions"
abstract: "xConnectによって返される例外事項と、発生しやすい時期の概要。"
---
# 例外の処理

このトピックでは、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 プロパティは無効になることがあります
-   すべての演算は入れ子状の Exception プロパティを持ちます

### XdbExecutionException後の操作の再試行

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

> !注並行性の問題で操作が失敗した場合は、[並行](https://doc.sitecore.com/xp/ja/developers/105/sitecore-experience-platform/optimistic-concurrency-in-xconnect.html "Optimistic concurrency in xConnect") 性トピックを参照してください。

以下の例では、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();
}