¿Cómo puedo atrapar un 404?

Tengo el siguiente código:

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

¿Cómo puedo detectar un error 404 específico? WebExceptionStatus.ProtocolError solo puede detectar que se ha producido un error, pero no proporciona el código exacto del error.

Por ejemplo:

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

Simplemente no es lo suficientemente útil … la excepción de protocolo podría ser 401, 503, 403, cualquier cosa realmente.

Use la HttpStatusCode Enumeration , específicamente HttpStatusCode.NotFound

Algo como:

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

Dónde
we una 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 } } 

No lo he probado, pero debería funcionar

 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 puedes usar filtros de excepción .

 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 } 

Creo que si capturas una WebException, hay información allí que puedes usar para determinar si era una 404. Esa es la única forma que conozco en este momento … Me interesaría conocer a los demás …

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

Mira este snipit. GetResponse lanzará una WebRequestException. Captura eso y puedes obtener el código de estado de la respuesta.

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

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

Consulte en MSDN el estado de la respuesta:

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

Para la gente de VB.NET que navega por esto, creo que podemos detectar la excepción solo si realmente es un 404. Algo así como:

 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 

WebException tipo de excepción adecuado WebException :

 try { var request = (HttpWebRequest) WebRequest.Create(String.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"); } 

cuando POST o GET datos al servidor utilizando la clase WebRequest, entonces el tipo de excepción sería WebException.Below es el código para la excepción de archivo no encontrado

  //Create a web request with the specified URL string 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); } }