2012-06-28 5 views
11

Hallo i Httpclient ähnlich wie diese bin mit:Httpclient - Umgang mit aggregierten Ausnahmen

public static Task<string> AsyncStringRequest(string url, string contentType) 
{ 
    try 
    { 
     var client = new HttpClient(); 
     client.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue(contentType)); 

     return client.GetStringAsync(url).ContinueWith(task => { 
      return task.Result; 
     }); 
    } 
    catch (AggregateException ex) 
    { 
     throw ex; 
    } 
    catch (WebException ex) 
    { 
     throw ex; 
    }  
    catch (Exception ex) 
    { 
     throw ex; 
    } 
} 

Aber ich Schwierigkeiten habe mit Ausnahmen zu tun. Ich habe die zusätzlichen catch-Blöcke hinzugefügt, nur um zu versuchen und zu werfen, aber keiner der Break-Punkte wird in irgendeinem der catch-Blöcke gefangen. Ich realisiere die Verwendung von Task die Ausnahme könnte in einem anderen Thread als der Aufrufer auftreten, so dass die Ausnahme in einen Aggregat-Container gewickelt ist, aber ich bin mir nicht sicher, was der beste Weg, um mit diesen Ausnahmen umzugehen ist.

Zum Beispiel ich mache eine Anfrage an einen Web-Service und spezifischen einen ungültigen Parameter in der Anforderung, und eine Ausnahme ausgelöst wird. Ich möchte, dass ich in der Lage bin, die Aggregatausnahmen zu erfassen und die Unerfahrenheiten zu untersuchen, um herauszufinden, warum die Anfrage fehlgeschlagen ist, und eine freundliche Nachricht zurückzugeben.

Also meine Frage ist, was ist der beste Weg, um diese Summe Ausnahmen und mit ihnen umgehen zu fangen?

Antwort

18

ist die Ausnahme von task.Result geworfen:

var client = new HttpClient(); 
client.DefaultRequestHeaders.Accept.Add(...); 
return client.GetStringAsync(url).ContinueWith(task => 
{ 
    try 
    { 
     return task.Result; 
    } 
    catch (AggregateException ex) 
    { 
     throw ex; 
    } 
    catch (WebException ex) 
    { 
     throw ex; 
    }  
    catch (Exception ex) 
    { 
     throw ex; 
    } 
}); 

Besser: überprüfen, ob die Aufgabe faulted vor dem Zugriff auf task.Result:

var client = new HttpClient(); 
client.DefaultRequestHeaders.Accept.Add(...); 
return client.GetStringAsync(url).ContinueWith(task => 
{ 
    if (task.IsFaulted) 
    { 
     var ex = task.Exception; 
    } 
    else if (task.IsCancelled) 
    { 
    } 
    else 
    { 
     return task.Result; 
    } 
}); 

Wenn Sie nicht tatsächlich kann man etwas in der ContinueWith, tun einfach weglassen:

var client = new HttpClient(); 
client.DefaultRequestHeaders.Accept.Add(...); 
return client.GetStringAsync(url); 
+0

Toll, ich werde es in der nächsten Stunde ausprobieren! – gdp

+9

Ich weiß, dass dies eine alte Frage ist, aber gibt es eine Möglichkeit, den HTTP-Statuscode von der aggregateexception abzurufen, wie es bei einer Webexception möglich ist? – gdp

+0

@gdp: Ja, Sie können die .Flatten für die AggregateException aufrufen und dann auf die InnerExceptions-Eigenschaft zugreifen und die darin enthaltene WebException abrufen. –

Verwandte Themen