Comment puis-je attraper un 404?

J’ai le code suivant:

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); request.Method = "HEAD"; request.Credentials = MyCredentialCache; try { request.GetResponse(); } catch { } 

Comment puis-je détecter une erreur 404 spécifique? WebExceptionStatus.ProtocolError ne peut détecter qu’une erreur s’est produite, mais ne donne pas le code exact de l’erreur.

Par exemple:

 catch (WebException ex) { if (ex.Status != WebExceptionStatus.ProtocolError) { throw ex; } } 

Est-ce juste pas assez utile … l’exception de protocole pourrait être 401, 503, 403, n’importe quoi vraiment.

Utilisez l’ HttpStatusCode Enumeration , en particulier HttpStatusCode.NotFound

Quelque chose comme:

 HttpWebResponse errorResponse = we.Response as HttpWebResponse; if (errorResponse.StatusCode == HttpStatusCode.NotFound) { // } 


we une WebException .

 try { var request = WebRequest.Create(uri); using (var response = request.GetResponse()) { using (var responseStream = response.GetResponseStream()) { // Process the stream } } } catch (WebException ex) { if (ex.Status == WebExceptionStatus.ProtocolError && ex.Response != null) { var resp = (HttpWebResponse) ex.Response; if (resp.StatusCode == HttpStatusCode.NotFound) { // Do something } else { // Do something else } } else { // Do something else } } 

Je n’ai pas testé cela, mais ça devrait marcher

 try { // TODO: Make request. } catch (WebException ex) { if (ex.Status == WebExceptionStatus.ProtocolError) { HttpWebResponse resp = ex.Response as HttpWebResponse; if (resp != null && resp.StatusCode == HttpStatusCode.NotFound) { // TODO: Handle 404 error. } else throw; } else throw; } 

En C # 6, vous pouvez utiliser des filtres d’exception .

 try { var request = WebRequest.Create(uri); using (var response = request.GetResponse()) using (var responseStream = response.GetResponseStream()) { // Process the stream } } catch(WebException ex) when ((ex.Response as HttpWebResponse)?.StatusCode == HttpStatusCode.NotFound) { // handle 404 exceptions } catch (WebException ex) { // handle other web exceptions } 

Je pense que si vous attrapez une WebException, il y a des informations que vous pouvez utiliser pour déterminer si c’était une 404. C’est la seule façon que je connaisse pour le moment … Je serais intéressé à en connaître d’autres …

 catch(WebException e) { if(e.Status == WebExceptionStatus.ProtocolError) { var statusCode = (HttpWebResponse)e.Response).StatusCode); var description = (HttpWebResponse)e.Response).StatusDescription); } } 

Découvrez ce snipit. GetResponse lancera une exception WebRequestException. Attrapez cela et vous pouvez obtenir le code de statut de la réponse.

 try { // Create a web request for an invalid site. Substitute the "invalid site" strong in the Create call with a invalid name. HttpWebRequest myHttpWebRequest = (HttpWebRequest) WebRequest.Create("invalid site"); // Get the associated response for the above request. HttpWebResponse myHttpWebResponse = (HttpWebResponse) myHttpWebRequest.GetResponse(); myHttpWebResponse.Close(); } catch(WebException e) { Console.WriteLine("This program is expected to throw WebException on successful run."+ "\n\nException Message :" + e.Message); if(e.Status == WebExceptionStatus.ProtocolError) { Console.WriteLine("Status Code : {0}", ((HttpWebResponse)e.Response).StatusCode); Console.WriteLine("Status Description : {0}", ((HttpWebResponse)e.Response).StatusDescription); } } catch(Exception e) { Console.WriteLine(e.Message); } 

ceci vient de http://msdn.microsoft.com/en-us/library/system.net.webexception.status.aspx

Voir à MSDN sur l’état de la réponse:

 ... catch(WebException e) { Console.WriteLine("The following error occured : {0}",e.Status); } ... 

Pour les utilisateurs de VB.NET qui naviguent sur ce site, je pense que nous ne pouvons attraper l’exception que s’il s’agit vraiment d’un 404. Quelque chose comme:

 Try httpWebrequest.GetResponse() Catch we As WebException When we.Response IsNot Nothing _ AndAlso TypeOf we.Response Is HttpWebResponse _ AndAlso (DirectCast(we.Response, HttpWebResponse).StatusCode = HttpStatusCode.NotFound) ' ... End Try 

Attrapez le type d’exception WebException :

 try { var request = (HttpWebRequest) WebRequest.Create(Ssortingng.Format("http://www.gravatar.com/avatar/{0}?d=404", hashe)); using(var response = (HttpWebResponse)request.GetResponse()) Response.Write("has avatar"); } catch(WebException e) { if(e.Response.StatusCode == 404) Response.Write("No avatar"); } 

lorsque POST ou GET des données sur le serveur en utilisant la classe WebRequest, le type d’exception serait WebException.Below est le code du fichier non trouvé exception

  //Create a web request with the specified URL ssortingng path = @"http://localhost/test.xml1"; WebRequest myWebRequest = WebRequest.Create(path); //Senda a web request and wait for response. try { WebResponse objwebResponse = myWebRequest.GetResponse(); Stream stream= objwebResponse.GetResponseStream(); } catch (WebException ex) { if (((HttpWebResponse)(ex.Response)).StatusCode == HttpStatusCode.NotFound) { throw new FileNotFoundException(ex.Message); } }