100 votes

Comment puis-je attraper une erreur 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 capturer une erreur 404 spécifique? Le WebExceptionStatus.ProtocolError peut seulement détecter qu'une erreur s'est produite, mais ne peut 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.

13 votes

NNNOOOOOOOOOOOOO! Ne capturez pas System.Exception, et ne dépendez pas du texte de l'exception dans votre gestionnaire!

2 votes

La réponse de John Saunders était la plus complète. Je pense que les gens l'ont simplement dévalué par pure méchanceté.

3 votes

Ne pas utiliser throw ex, vous allez générer une nouvelle exception avec une pile d'appels vide. Utilisez simplement throw.

127voto

John Saunders Points 118808
essayer
{
    var demande = WebRequest.Create(uri);
    en utilisant (var réponse = demande.GetResponse())
    {
        en utilisant (var responseStream = réponse.GetResponseStream())
        {
            // Traiter le flux
        }
    }
}
catch (WebException ex)
{
    si (ex.Status == WebExceptionStatus.ProtocolError &&
        ex.Response != null)
    {
        var resp = (HttpWebResponse) ex.Response;
        si (resp.StatusCode == HttpStatusCode.NotFound)
        {
            // Faire quelque chose
        }
        else
        {
            // Faire quelque chose d'autre
        }
    }
    autrement
    {
        // Faire quelque chose d'autre
    }
}

10 votes

Lol @ being the IDisposable police and giving everyone a -1 for not wrapping the response in a using block.

2 votes

C'est un travail difficile, mais quelqu'un doit le faire. D'un autre côté, je n'ai presque pas ajouté cette réponse, car cela pourrait sembler que je critiquais tous les autres pour que la mienne soit la réponse la mieux notée.

3 votes

J'ai en fait voté favorablement, mais je viens de remarquer une chose : il devrait probablement y avoir un throw (rejet) à la fin de votre catch, sinon cela va simplement avaler silencieusement tout autre type de WebException.

121voto

Jay Riggs Points 30783

Utilisez l'Énumération HttpStatusCode, en particulier HttpStatusCode.NotFound

Quelque chose comme:

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


we est une WebException.

0 votes

Puis-je obtenir le NUMÉRO d'une manière ou d'une autre à partir des objets sans créer ma propre liste de recherche? J'aimerais obtenir quelque chose comme : int httpresponsecode = HttpStatusCode.ToInt() ou similaire pour obtenir 404

2 votes

@BerggreenDK vous devriez simplement pouvoir faire int httpresonsecode = (int) HttpStatusCode.NotFound

8 votes

-1 Explication partielle de mon downvote ancien: le code lance une NullReferenceException si, pour une raison quelconque, we.Response n'est pas HttpWebResponse. Si le code souhaite supposer qu'il aura toujours ce type, alors il devrait simplement caster: HttpWebResponse errorResponse = (HttpWebResponse)we.Response;. Ceci lancera une InvalidCastException explicite si l'impossible se produit, au lieu d'une mystérieuse NullReferenceException.

12voto

MiffTheFox Points 10537

Je n'ai pas testé ça, mais ça devrait fonctionner

try
{
    // TODO: Faire la requête.
}
catch (WebException ex)
{
    if (ex.Status == WebExceptionStatus.ProtocolError) {
        HttpWebResponse resp = ex.Response as HttpWebResponse;
        if (resp != null && resp.StatusCode == HttpStatusCode.NotFound)
        {
            // TODO: Gérer l'erreur 404.
        }
        else
            throw;
    }
    else
        throw;
}

0 votes

@John Saunders - Je suis en train d'adapter le code de l'OP, pas de l'optimiser.

0 votes

@John - Et peut-être que je m'attendais seulement à ce qu'ils copient/colent le bloc catch, puisque j'avais exactement le même code dans le bloc try que l'OP. Tu devrais vraiment voter négativement pour cette question en raison du code de l'OP alors.

1 votes

@John, nous avons oublié voici le code d'exemple. C'est le cas d'une autre façon de 404, pas comment utiliser GetResponse. -1 semble un peu sévère. +1 à Miff pour avoir répondu à la question.

4voto

mezoid Points 10293

Je pense que si vous attrapez une WebException, il y a des informations que vous pouvez utiliser pour déterminer s'il s'agissait d'une erreur 404. C'est la seule méthode que je connais pour l'instant... Je serais intéressé de connaître d'autres méthodes...

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

2voto

Jonathan S. Points 419

Découvrez cet extrait. GetResponse lancera une WebRequestException. Attrapez-la et vous pourrez obtenir le code d'état de la réponse.

try {
   // Crée une demande web pour un site non valide. Remplacez la chaîne "site non valide" dans l'appel Create par un nom invalide.
     HttpWebRequest myHttpWebRequest = (HttpWebRequest) WebRequest.Create("site non valide");

    // Obtenez la réponse associée à la demande ci-dessus.
     HttpWebResponse myHttpWebResponse = (HttpWebResponse) myHttpWebRequest.GetResponse();
    myHttpWebResponse.Close();
}
catch(WebException e) {
    Console.WriteLine("Ce programme devrait lancer une WebException lors de son exécution réussie."+
                        "\n\nMessage de l'exception :" + e.Message);
    if(e.Status == WebExceptionStatus.ProtocolError) {
        Console.WriteLine("Code d'état : {0}", ((HttpWebResponse)e.Response).StatusCode);
        Console.WriteLine("Description de l'état : {0}", ((HttpWebResponse)e.Response).StatusDescription);
    }
}
catch(Exception e) {
    Console.WriteLine(e.Message);
}

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X