24 votes

Comment vérifier une demande WebClient pour une erreur 404

J'ai un programme que j'écris qui télécharge des fichiers. Le deuxième fichier n'est pas nécessaire et n'est inclus que parfois. Lorsque le deuxième fichier n'est pas inclus, il renverra une erreur HTTP 404.

Maintenant, le problème est que lorsque cette erreur est renvoyée, elle met fin à tout le programme. Ce que je veux, c'est continuer le programme et ignorer l'erreur HTTP. Alors, ma question est la suivante : comment attraper une erreur HTTP 404 à partir d'une demande WebClient.DownloadFile ?

Voici le code actuellement utilisé :

WebClient downloader = new WebClient();
foreach (string[] i in textList)
{
    String[] fileInfo = i;
    string videoName = fileInfo[0];
    string videoDesc = fileInfo[1];
    string videoAddress = fileInfo[2];
    string imgAddress = fileInfo[3];
    string source = fileInfo[5];
    string folder = folderBuilder(path, videoName);
    string infoFile = folder + '\\' + removeFileType(retrieveFileName(videoAddress)) + @".txt";
    string videoPath = folder + '\\' + retrieveFileName(videoAddress);
    string imgPath = folder + '\\' + retrieveFileName(imgAddress);
    System.IO.Directory.CreateDirectory(folder);
    buildInfo(videoName, videoDesc, source, infoFile);
    textBox1.Text = textBox1.Text + @"début du téléchargement des fichiers pour" + videoName;
    downloader.DownloadFile(videoAddress, videoPath);
    textBox1.Text = textBox1.Text + @"Vidéo complète pour" + videoName;
    downloader.DownloadFile(imgAddress, imgPath);
    textBox1.Text = textBox1.Text + @"Image complète pour" + videoName;
}

32voto

Ian Kemp Points 6408

Si vous voulez spécifiquement attraper l'erreur 404 :

using (var client = new WebClient())
{
  try
  {
    client.DownloadFile(url, destination);
  }
  catch (WebException wex)
  {
    if (((HttpWebResponse) wex.Response).StatusCode == HttpStatusCode.NotFound)
    {
      // erreur 404, faites ce que vous avez à faire
    }
  }
}

Ou, en utilisant C# 7 ou ultérieur:

using (var client = new WebClient())
{
  try
  {
    client.DownloadFile(url, destination);
  }
  catch (WebException ex) when
        (ex.Response is HttpWebResponse wr && wr.StatusCode == HttpStatusCode.NotFound)
  {      
    // erreur 404, faites ce que vous avez à faire
  }
}

12voto

Runscope API Tools Points 43859

WebClient va jeter une WebException pour toutes les réponses 4xx et 5xx.

try {
    downloader.DownloadFile(videoAddress, videoPath);
}
catch (WebException ex) {
    // le gérer ici
}

7voto

Amar Palsapure Points 7025

Placez le try catch à l'intérieur de votre boucle foreach.

 foreach (string[] i dans textList)
 {
    try
    {
        String[] fileInfo = i;
        string videoName = fileInfo[0];
        string videoDesc = fileInfo[1];
        string videoAddress = fileInfo[2];
        string imgAddress = fileInfo[3];
        string source = fileInfo[5];
        string folder = folderBuilder(path, videoName);
        string infoFile = folder + '\\' + removeFileType(retrieveFileName(videoAddress)) + @".txt";
        string videoPath = folder + '\\' + retrieveFileName(videoAddress);
        string imgPath = folder + '\\' + retrieveFileName(imgAddress);
        System.IO.Directory.CreateDirectory(folder);
        buildInfo(videoName, videoDesc, source, infoFile);
        textBox1.Text = textBox1.Text + @"début du téléchargement des fichiers pour" + videoName;
        if(Download(videoAddress, videoPath) == false)
        {
           //Téléchargement échoué. Faites ce que vous voulez.
        }
        textBox1.Text = textBox1.Text + @"Vidéo complète pour" + videoName;
        if(Download(imgAddress, imgPath)== false)
        {
           //Téléchargement échoué. Faites ce que vous voulez.
        }
        textBox1.Text = textBox1.Text + @"Image complète pour" + videoName;
    }
    catch(Exception ex)
    {
        //Les erreurs telles que les exceptions d'E/S, les erreurs de sécurité peuvent être gérées ici. Vous pouvez les journaliser si vous le souhaitez.
    }
 }

Fonction privée pour télécharger le fichier

 private bool Download(string url, string destination)
 {
     try
     {
         WebClient downloader = new WebClient();
         downloader.DownloadFile(url, destination);
         return true;
     }
     catch(WebException webEx)
     {
        //Vérifiez (HttpWebResponse)webEx.Response).StatusCode
        // Ou
        //Vérifiez webEx.Status
     }
     return false;
 }

Vous pouvez vérifier la WebException pour le statut. Selon le code d'erreur, vous pouvez continuer ou arrêter.

En savoir plus @ MSDN

Suggestion

  • Utilisez Path.Combine pour créer le chemin du dossier.
  • Vous pouvez utiliser String.Format pour joindre deux chaînes, au lieu de +.

J'espère que cela fonctionne pour vous.

1voto

Laird Streak Points 399

Utilisez un try catch WebException dans votre code et examinez le message d'Exception - il contiendra le StatusCode http.

Vous pouvez effacer l'Exception et continuer.

1voto

Sergey Points 185

Vous pouvez essayer ce code pour obtenir le code de statut HTTP à partir de WebException ou OpenReadCompletedEventArgs.Error:

HttpStatusCode GetHttpStatusCode(System.Exception err)
{
    if (err is WebException)
    {
        WebException we = (WebException)err;
        if (we.Response is HttpWebResponse)
        {
            HttpWebResponse response = (HttpWebResponse)we.Response;
            return response.StatusCode;
        }
    }
    return 0;
}

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