c# est-il ok pour incorporer un “try/catch” dans une “aide” déclaration pour une requête web? Est mon code correct?
Est-il ok pour incorporer un "try/catch" dans une "aide" déclaration pour une requête web? Est mon code correct? C'est à mes exigences sont:
-
Souhaitez utiliser l'instruction "using" pour vous assurer que les ressources sont libérées dans tous les cas, pour HttpWebResponse
- Mais encore envie de faire quelques trucs si il y a une exception en HttpWebResponse et "réponse = (HttpWebResponse)demande.GetResponse();" en particulier.
Mon code source:
var result = new HttpHeaderInfo();
HttpWebRequest request = null;
HttpWebResponse response = null;
using (response)
{
try
{
request = (HttpWebRequest)WebRequest.Create(uri);
request.Method = "HEAD";
request.KeepAlive = false;
request.Timeout = Properties.Settings.Default.WebTimeoutDefault;
response = (HttpWebResponse)request.GetResponse();
result.LastModified = response.LastModified;
result.ContentType = response.ContentType;
result.StatusCode = response.StatusCode;
result.ContentLength = response.ContentLength;
}
catch (Exception ex)
{
if (ex is InvalidOperationException ||
ex is ProtocolViolationException ||
ex is WebException)
{
result.HttpError = ex;
result.LastModified = System.DateTime.MinValue;
result.ContentType = null;
}
else { throw; }
}
}
grâce
Vous devez vous connecter pour publier un commentaire.
C'est OK, mais un peu redondant; dans un sens général, vous pouvez facilement supprimer les
using
bloc, ajouter unfinally
bloc après lecatch
, et appeler explicitementDispose
là, qui permettrait de réduire la nidification dans votre code.Dans un sens plus spécifique, ce qui me dérange un peu, c'est que vous n'avez pas réellement affecter
response
jusqu'à ce que vous obtenez à l'intérieur de lausing
bloc, et de l'explicite les déclarations de variables sont inutiles et déroutant dans ce contexte. Je voudrais réécrire sous la forme:C'est beaucoup plus clair que la forme originale. Notez également que je suis attraper
WebException
, pas le génériqueSystem.Exception
. Vous devez attraper spécifiques de types d'exceptions au lieu d'interception des exceptions génériques et puis vérification de leur type.catch
des blocs de "Crétin" la réponse montre un exemple de cela. (Remarque: je serais probablement prendreProtocolViolationException
mais pasInvalidOperationException
- le premier provient du dernier et vous ne devriez pas obtenir tout autre type deInvalidOperationException
deGetResponse
, pas pour autant que je sais que de toute façon...)D'autres l'ont fait comme potentiel problème, mais je veux l'élever comme un très précis problème: à l'aide de votre déclaration est en train de faire, pas bon du tout pour le moment.
Lorsque vous écrivez une instruction d'utilisation comme ceci:
il est
value1
qui seront éliminés à la fin du bloc, pasvalue2
. Dans votre code,response
est nulle jusqu'à l'intérieur du bloc; leWebResponse
vous vous retrouvez avec la volonté de pas être éliminés.Vous devriez voir un avertissement à ce sujet, le long de ces lignes:
Que l'avertissement est important d'en tenir compte.
Laissant cela de côté, il est tout à fait raisonnable de mettre un bloc try/catch dans une instruction d'utilisation... mais dans ce cas, il devrait probablement être à l'extérieur l'instruction d'utilisation, vous permettant d'initialiser le
response
variable au moment approprié, de sorte que la réponse sera toujours disposé. Je voudrais également envisager d'utiliser plusieurs blocs catch de l'appel d'une méthode commune plutôt que d'utiliser le "est" à plusieurs reprises.C'est tout à fait OK. Vous gérer l'exception et ne souhaite pas remonter plus loin, c'est tout simplement beau, et imbriquée try/catch/finally blocs ne sont pas un problème. (En interne a 'l'aide' comme ceci est juste un try/finally.)
Mise à JOUR: lire un peu plus près, et je pense que vous voulez vraiment l'utiliser à l'intérieur de l' "d'essayer" bloc de la ligne où vous mettez un objet dans la réponse de la variable est l'endroit où vous souhaitez que le "à l'aide" en bloc pour commencer. Est en fait le compiler en tant que-est?