2012-06-28 38 views
11

Hi tôi đang sử dụng HttpClient tương tự như sau:HttpClient - đối phó với trường hợp ngoại lệ tổng

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

Nhưng tôi đang gặp khó khăn đối phó với trường hợp ngoại lệ. Tôi đã thêm các khối bắt bổ sung chỉ để thử và bước ném, nhưng không ai trong số các điểm phá vỡ được bắt gặp trong bất kỳ khối catch nào. Tôi nhận ra bằng cách sử dụng Task ngoại lệ có thể xảy ra trên một thread khác với người gọi để ngoại lệ được bọc trong một container tổng hợp, nhưng tôi không chắc chắn cách tốt nhất để đối phó với những ngoại lệ này là gì.

Ví dụ: tôi yêu cầu dịch vụ web và thông số không hợp lệ cụ thể trong yêu cầu và ngoại lệ được ném. Tôi muốn tôi có thể nắm bắt các ngoại lệ tổng hợp và xem xét các quan điểm độc lập để tìm ra lý do tại sao yêu cầu đó thất bại và trả lại một thông điệp thân thiện.

Vì vậy, câu hỏi của tôi là, cách tốt nhất để nắm bắt những ngoại lệ tổng hợp này và xử lý chúng là gì?

Trả lời

18

Trường hợp ngoại lệ được ném bởi 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; 
    } 
}); 

Better: kiểm tra nếu nhiệm vụ faulted trước khi truy cập 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; 
    } 
}); 

Nếu bạn không thực sự làm điều gì đó trong ContinueWith, bạn có thể chỉ cần bỏ qua nó:

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

Tuyệt, tôi sẽ thử nó trong giờ tiếp theo! – gdp

+9

Tôi biết đây là một câu hỏi cũ, nhưng có cách nào để lấy mã trạng thái http từ sự tổng hợp ngoại lệ, giống như bạn có thể khi bắt được một ngoại lệ web? – gdp

+0

@gdp: Có, bạn có thể gọi .Flatten trên AggregateException và sau đó truy cập vào thuộc tính InnerExceptions và rút ra WebException chứa bên trong nó. –

Các vấn đề liên quan