例外の処理
このページの翻訳は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
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
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() メソッドでクライアントに追加し、バッチを再送信することで再試行できます。これは接続の問題で失敗した操作に便利です。
!注並行性の問題で操作が失敗した場合は、並行 性トピックを参照してください。
以下の例では、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(); }