簡體   English   中英

在 Parallel.ForEach 循環 C# 中錯誤捕獲的特定異常

[英]Specific exception caught incorrectly in Parallel.ForEach loop C#

看起來在我創建的 Parallel.ForEach 循環中錯誤地捕獲了特定異常。

這是 Parallel.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("-----------------------------------------\r\n");

        }
        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("-----------------------------------------\r\n");

        }
       
    }
    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("-----------------------------------------\r\n");

    }
   
});

這是日志語句的樣子

日志記錄

從日志語句中可以看出,System.Service.FaultException 正在落入特定的CommunicationException catch 塊。 我無法對此做出正面或反面。

誰能看到我在這里做錯了什么? 如何捕獲正確的異常並排除錯誤的異常?

那是因為FaultException是一個子類CommunicationException ,所以當您捕獲所有CommunicationException ,根據定義,您也捕獲了FaultException

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM