Конкретное исключение, неправильно перехваченное параллельно.Для каждого цикла C#

#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. Но я хотел бы, чтобы был более чистый способ сделать это.