#c# #dynamics-crm
#c# #dynamics-crm
Вопрос:
Похоже, что конкретное исключение неправильно перехватывается параллельно.Для каждого цикла, который я создал.
Вот параллель.Цикл ForEach.
Parallel.ForEach(allRelatedEntities.Entities, relEntity =>
{
Log("Processing UpsertRequest for referencing entity " relEntity.LogicalName);
UpsertRequest request = new UpsertRequest()
{
Target = relEntity
};
try
{
TryUpsert(relEntity, request);
}
catch (CommunicationException ex)
{
Log("CommunicationException? " ex.ToString());
try
{
Log("Retrying upsert - start (sleep 10), TID = " Thread.CurrentThread.ManagedThreadId);
Thread.Sleep(10);
TryUpsert(relEntity, request);
}
catch (CommunicationException ex2)
{
Log("Retrying upsert - failed (CommunicationException), TID = " Thread.CurrentThread.ManagedThreadId);
Log("Exception on upserting " relEntity.LogicalName " record having id " relEntity.Id ", TID = " Thread.CurrentThread.ManagedThreadId);
Log("Exception Message : " ex2.ToString() ", TID = " Thread.CurrentThread.ManagedThreadId);
Log("Exception TraceText : " ((FaultException<OrganizationServiceFault>)ex).Detail.TraceText ", TID = " Thread.CurrentThread.ManagedThreadId);
Log("-----------------------------------------rn");
}
catch (Exception e)
{
Log("Retrying upsert - success (other exception), TID = " Thread.CurrentThread.ManagedThreadId);
Log("Exception on upserting " relEntity.LogicalName " record having id " relEntity.Id ", TID = " Thread.CurrentThread.ManagedThreadId);
Log("Exception Message : " ex.ToString() ", TID = " Thread.CurrentThread.ManagedThreadId);
Log("Exception TraceText : " ((FaultException<OrganizationServiceFault>)ex).Detail.TraceText ", TID = " Thread.CurrentThread.ManagedThreadId);
Log("-----------------------------------------rn");
}
}
catch(Exception e)
{
Log("Exception on upserting " relEntity.LogicalName " record having id " relEntity.Id ", TID = " Thread.CurrentThread.ManagedThreadId);
Log("Exception Message : " e.ToString() ", TID = " Thread.CurrentThread.ManagedThreadId);
if(e is FaultException<OrganizationServiceFault>)
Log("Exception TraceText : " ((FaultException<OrganizationServiceFault>)e).Detail.TraceText ", TID = " Thread.CurrentThread.ManagedThreadId);
Log("-----------------------------------------rn");
}
});
Вот как выглядит оператор ведения журнала
Как вы можете видеть из инструкции протоколирования, система.Обслуживание.Исключение FaultException попадает в определенный CommunicationException
блок catch. Я не могу понять, что это такое.
Кто-нибудь может увидеть, что я здесь делаю не так? Как мне фиксировать правильные исключения и исключать неправильные?
Ответ №1:
Это потому, что FaultException является исключением CommunicationException подкласса, поэтому, когда вы перехватываете все CommunicationException
исключения, вы по определению также перехватываете FaultException
.
Комментарии:
1. Интересно. Есть ли способ специально перехватывать исключения CommunucationExceptions, которые генерируются, а не их подклассы?
2. Я думаю, что могу использовать фильтрацию исключений и проанализировать пример. Введите строку() и найдите текстовую систему. ServiceModel. Исключение CommunicationException. Но я хотел бы, чтобы был более чистый способ сделать это.