2017-04-03 1 views
0

enthalten ist. Eine Datenbankabfrage wird in einer Task ausgeführt, die einen CancellationToken von 59 Sek. Aufweist. Wenn die Aufgabe abgebrochen wird, wird eine TaskCanceledException ausgelöst. Diese Ausnahme wird jedoch als Teil einer AggregateException abgefangen. Ich möchte eine spezifische Fehlermeldung bereitstellen. Ist es also möglich, im Code zu überprüfen, ob die echte Ausnahme in der AggregateException eine TaskCancelationException ist?Erhalten Sie einen echten Ausnahmetyp, der in AggregateException

+0

'await' die Aggregate auspackt und führt den ersten der' InnerExceptions' –

+0

Überprüfen Sie die [Dokumentation der Klasse] (https://msdn.microsoft.com/en -us/library/system.aggregateexception (v = vs.110) .aspx). Es zeigt, wie auf die inneren Ausnahmen zugegriffen werden kann, mehrere Aggregatausnahmen zu einem einzigen reduziert werden können oder 'Handle' verwendet wird, um alle inneren Ausnahmen zu verarbeiten –

Antwort

2

Sie benötigen InnerException oder InnerExceptions zu verwenden, je nach Ihrer Situation:

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

Das obige funktioniert, wenn Sie wissen, dass Sie nur eine Ausnahme haben; Wenn Sie jedoch mehrere haben, dann möchten Sie etwas mit ihnen allen tun:

var sb = new StringBuilder(); 

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

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

Sie die Liste der Ausnahmen bekommen, oder die ersten verwenden, wenn es nur eine ist:

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

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

Überprüfung der Art des Innerexception bearbeitetem

 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; 
     } 

aber nach der Ausnahme wird über die geworfen WCF-Kommunikation ist es wieder in einer AggregateException gekapselt. Und aus irgendeinem Grund ist der Mechanismus zum Auslesen des zweiten Ausnahmetyps nicht so einfach. Aber mit der folgenden es funktioniert:

   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; 
       } 
Verwandte Themen