c# - unite - trampa escollo mhw
¿Cómo puedo atrapar un 404? (10)
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? El objeto WebExceptionStatus.ProtocolError solo puede detectar un error, pero no puede proporcionar 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 del protocolo podría ser 401, 503, 403, cualquier cosa realmente.
Captura el 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");
}
Consulte en MSDN sobre el estado de la respuesta:
...
catch(WebException e) {
Console.WriteLine("The following error occured : {0}",e.Status);
}
...
Creo que si WebException una WebException hay información que puedes usar para determinar si era una 404. Esa es la única forma que conozco en este momento ... Me interesaría saber alguna otra ...
catch(WebException e) {
if(e.Status == WebExceptionStatus.ProtocolError) {
var statusCode = (HttpWebResponse)e.Response).StatusCode);
var description = (HttpWebResponse)e.Response).StatusDescription);
}
}
Echa un vistazo a este snipit. El 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 WebException
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
}
No he probado esto, 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;
}
Para la gente de VB.NET que navega por esto, creo que podemos detectar la excepción solo si realmente es un 404. Algo 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
Use la HttpStatusCode Enumeration
, específicamente HttpStatusCode.NotFound
Algo como:
HttpWebResponse errorResponse = we.Response as HttpWebResponse;
if (errorResponse.StatusCode == HttpStatusCode.NotFound) {
//
}
Dónde
we
es una WebException
.
cuando los datos POST o GET en el servidor utilizando la clase WebRequest, el tipo de excepción sería WebException. A continuación se muestra 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);
}
}
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
}
}