J'ai le code suivant:
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.Method = "HEAD";
request.Credentials = MyCredentialCache;
try
{
request.GetResponse();
}
catch
{
}
Comment détecter une erreur 404 spécifique? WebExceptionStatus.ProtocolError peut uniquement détecter qu'une erreur s'est produite, mais ne pas donner le code exact de l'erreur.
Par exemple:
catch (WebException ex)
{
if (ex.Status != WebExceptionStatus.ProtocolError)
{
throw ex;
}
}
N'est tout simplement pas assez utile ... l'exception de protocole pourrait être 401, 503, 403, n'importe quoi vraiment.
Utilisez le HttpStatusCode Enumeration
, Plus précisément HttpStatusCode.NotFound
Quelque chose comme:
HttpWebResponse errorResponse = we.Response as HttpWebResponse;
if (errorResponse.StatusCode == HttpStatusCode.NotFound) {
//
}
Oùwe
est un 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
}
}
En C # 6, vous pouvez utiliser 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 n'ai pas testé ça, 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;
}
Je pense que si vous attrapez un WebException il y a des informations que vous pouvez utiliser pour déterminer s'il s'agissait d'un 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);
}
}
Pour les gens de VB.NET parcourant ceci, je crois 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
Voir à MSDN sur l'état de la réponse:
...
catch(WebException e) {
Console.WriteLine("The following error occured : {0}",e.Status);
}
...
Attrapez le type d'exception approprié 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");
}
Découvrez ce snipit. GetResponse lèvera une exception WebRequestException. Attrapez cela et vous pouvez obtenir le code d'état 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);
}
cela venait de http://msdn.Microsoft.com/en-us/library/system.net.webexception.status.aspx
lorsque POST ou obtenir des données sur le serveur à l'aide de la classe WebRequest, le type d'exception serait WebException. Ci-dessous est le code pour l'exception de fichier introuvable
//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);
}
}