2017-02-15 5 views
0

J'ai une méthode dans laquelle j'appelle DownloadData sur un WebClient. Cette méthode émet une exception car l'URL renvoie 404. Tout cela est attendu par les spécifications car la ressource n'existe pas.Impossible de créer une exception WebException

Le client Web lancera une exception WebException et je dois lire le corps de respose car il contient un objet JSON avec une erreur détaillée. Après cela, je dois à nouveau lancer une exception WebException car la couche attend encore l'exception WebException. En ce moment je suis en train de construire un WebException avec des détails de l'actuel comme suit:

catch(WebException ex) 
{ 
    var response = new StreamReader(ex.Response.GetResponseStream()).ReadToEnd(); 
    dynamic error = JsonConvert.DeserializeObject(response); 
    throw new WebException(error.message, null, ex.Status, ex.Response); 
} 

Le problème est que je reçois une exception lors de la construction WebException. C'est le message!

Le match de la meilleure méthode surchargée pour 'System.Net.WebException.WebException (string, System.Net.WebExceptionStatus, System.Net.WebExceptionInternalStatus, System.Exception)' a des arguments invalides

C'est comme si ce constructeur n'existait pas! Vérifiez le constructeur en exception et vérifiez le constructeur dans le bloc catch.

Comme vous pouvez le voir, j'utilise un constructeur valide. Vérifiez here.

Que se passe-t-il ici?

+0

Lire l'erreur, vos paramètres que vous passez par –

+0

sont incorrects Essayez votre casting 'null' - sons bizarre, je sais, mais cela peut aider à la résolution de surcharge (si cela est vraiment le problème). –

+0

Essayez également d'utiliser 'string message = error.message;' puis utilisez-le pour que la résolution de surcharge se produise au moment de la compilation au lieu de l'exécution. –

Répondre

1

Le problème est que vous devez lancer error.message sous forme de chaîne. Ce serait encore mieux si vous manipuliez cette chaîne différemment afin que vous puissiez vérifier si ce error.message existe.

catch(WebException ex) 
{ 
    var response = new StreamReader(ex.Response.GetResponseStream()).ReadToEnd(); 
    dynamic error = JsonConvert.DeserializeObject(response); 
    throw new WebException((string)error.message, null, ex.Status, ex.Response); 
} 
+0

Ceci est correct. Je vous remercie! – Rob

+0

Comme je l'ai dit, essayez de mettre un contrôle supplémentaire pour l'objet d'erreur, car il peut ne pas contenir de propriété de message et alors vous aurez une autre exception :) – MaticDiba