2017-04-03 61 views
0

在具有59sec的CancellationToken的任務中執行數據庫查詢。如果任務被取消,則拋出TaskCanceledException。但是這個異常被捕獲爲AggregateException的一部分。 我想提供一個特定的錯誤消息。那麼是否有可能在代碼中驗證AggregateException中的真正異常是否是TaskCancelationException?獲取AggregateException中包含的實際異常類型

+0

'await'解開的AggregateException並拋出第一個'InnerExceptions'的 –

+0

檢查[類的文檔(https://msdn.microsoft.com/en -us /庫/ system.aggregateexception(v = vs.110)的.aspx)。它顯示瞭如何訪問內部異常,將多個聚合異常合併爲一個,或者使用'Handle'處理所有內部異常 –

回答

2

您需要使用InnerExceptionInnerExceptions,根據您的情況:

if (x.InnerException is TaskCanceledException) 
{ 
    // ... 
} 

如果你知道你只有一個例外,那麼上面的方法就行得通;但是,如果您有多個,那麼你想要做的事與他們:

var sb = new StringBuilder(); 

foreach (var inner in x.InnerExceptions) 
{ 
    sb.AppendLine(inner.ToString()); 
} 

System.Diagnostics.Debug.Print(sb.ToString()); 
3

你可以得到例外列表中,或者使用第一個,如果只有一個:

var first = agg.InnerException; // just the first 

foreach (Exception ex in agg.InnerExceptions) // iterate over all 
{ 
    // do something with each and every one 
} 
0

檢查的InnerException類型奮力:

 catch (AggregateException ae) 
     { 
      if (ae.InnerException is TaskCanceledException) 
      { 
       LoggerService.Log(LogLevel.Error, "GetReport Request was cancelled"); 
       throw ae.InnerException; 
      } 

      LoggerService.Log(LogLevel.Error, string.Format("GetReport Request failed: {0}", ae.InnerException.Message)); 
      throw; 
     } 

但異常後扔過WCF通信,它再次封裝在一個AggregateException中。 由於某種原因,讀出第二種異常類型的機制並不那麼容易。但有以下這是工作:

   catch (AggregateException ae) 
       { 
        endMessage = string.Format("Defined Query failed. Error: {0}", ae.Message); 

        // Set specific error message when TaskCanceledException is contained in AggregateException 
        var fe = ae.InnerException as FaultException<ExceptionDetail>; 
        if (fe != null) if (Type.GetType(fe.Detail.Type) == typeof(TaskCanceledException)) endMessage = "Defined Query was cancelled"; 

        logLevel = LogLevel.Error; 
        messageType = MessageType.Error; 
       } 
相關問題