2012-06-28 20 views
11

Ciao io sto usando HttpClient simile a questo:HttpClient - si tratta di eccezioni aggregati

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

Ma io sto avendo difficoltà che fare con le eccezioni. Ho aggiunto i blocchi di cattura aggiuntivi solo per provare e lanciare il lancio, ma nessuno dei punti di interruzione viene catturato in nessuno dei blocchi di cattura. Mi rendo conto che usando Task l'eccezione potrebbe verificarsi su un thread diverso dal chiamante in modo che l'eccezione sia racchiusa in un contenitore aggregato, ma non sono sicuro di quale sia il modo migliore per gestire queste eccezioni.

Ad esempio, faccio richiesta a un servizio Web e specifica un parametro non valido nella richiesta e viene generata un'eccezione. Voglio essere in grado di cogliere le eccezioni aggregate e osservare le intolleranze per capire perché la richiesta ha fallito e restituire un messaggio amichevole.

Quindi la mia domanda è: qual è il modo migliore per cogliere queste eccezioni aggregate e gestirle?

risposta

18

L'eccezione viene generata da task.Result:

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

Meglio: verificare se l'attività faulted prima di accedere 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; 
    } 
}); 

Se non sta effettivamente facendo qualcosa nel ContinueWith, è possibile semplicemente omettalo:

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

Grande, lo proverò nella prossima ora! – gdp

+9

So che questa è una vecchia domanda, ma esiste un modo per ottenere il codice di stato http dall'eccezione cumulativa, come quando si rileva una scossa web? – gdp

+0

@gdp: Sì, è possibile chiamare .Flatten su AggregateException e quindi accedere alla proprietà InnerExceptions ed estrarre la WebException contenuta al suo interno. –

Problemi correlati