2011-05-25 2 views
6

Je travaille sur du code pour utiliser HttpWebRequest de manière asynchrone. Si l'un d'entre vous l'a déjà fait, sachez que la gestion des erreurs peut être un peu pénible car si une exception est renvoyée dans l'une des méthodes de rappel, elle ne peut pas être renvoyée au code appelant via un essai./catch block. Ce que je veux faire est de gérer les erreurs en sauvegardant les exceptions dans mon objet d'état qui est passé à chaque méthode de rappel. Si une exception est détectée, l'objet d'état sera mis à jour et l'appel http sera annulé. Le problème que j'ai est que dans mon objet d'état, je dois utiliser une propriété Exception afin que n'importe quel type d'exception puisse être stocké. Lorsque le code appelant vérifie l'objet d'état et "voit" une exception, il ne sait pas de quel type d'exception il s'agit.Quelle est la meilleure façon de gérer les exceptions HttpWebRequest asynchrones en C#?

Existe-t-il un moyen d'autoriser mon objet d'état à contenir n'importe quel type d'exception tout en conservant une forte typage?

État objet

public class HttpPostClientAsyncModel 
    { 
     public HttpResponseSnapshot Response { get; set; } 
     public HttpPostClientAsyncStatus Status { get; set; } 
     public Exception Exception { get; set; } 
     public WebRequest Request { get; set; } 
    } 
+0

Le code d'appel pourrait simplement jeter model.Exception l'intérieur d'un bloc try puis configuration attrapés pour les sous-types Exception spécifiques que l'appelant peut gérer de manière appropriée. Ou peut-être pas ... :) – dlev

+0

Est-ce seulement pour l'expérience d'apprentissage? Quel est le problème avec 'HttpWebRequest.BeginGetResponse'? –

Répondre

1

L'objet d'exception est toujours fortement typé et conserve ses valeurs de champ d'origine. Tout ce que vous avez besoin est de vérifier comme ceci:

if (asyncModel.Exception is ArgumentException) 
{ 
    // Handle argument exception here 
    string invalidParameter = (asyncModel.Exception as ArgumentException).ParamName; 
} 
else if (...) 
{ 
} 

Vous le feriez normalement un contrôle très similaire avec bloc try/catch de toute façon si cela ne devrait pas être gênant. Si vous êtes vraiment inquiet à ce sujet, il suffit de créer un nouveau thread avec les méthodes de synchronisation et gérer l'exception des options de continuation:

Task.Factory.StartNew(() => { DoWork(); }) 
.ContinueWith(t => Logger.Error("An exception occurred while processing. Check the inner exception for details", t.Exception), 
TaskContinuationOptions.OnlyOnFaulted); 
Questions connexes