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

0voto

Guillaume Slashy Points 1227

Utilisez un bloc try{} catch{} avec WebException à l'intérieur de votre boucle ! Je ne sais pas quel IDE vous utilisez, mais avec Visual Studio, vous pouvez obtenir beaucoup d'informations sur l'exception :)

0voto

Holger Points 1350

Comme d'autres l'ont écrit, un bloc try-catch suffirait.

Un autre conseil est d'utiliser HTTP HEAD pour vérifier s'il y a quelque chose là-dedans (c'est plus léger que de faire un GET HTTP complet) :

var url = "URL à vérifier";
var req = HttpWebRequest.Create(url);
req.Method = "HEAD"; //c'est ce qui en fait une demande "HEAD"
WebResponse res = null;
try
{
    res = req.GetResponse();
    res.Close();
    return true;
}
catch
{
    return false;
}
finally
{
    if (res != null)
        res.Close();
}

0voto

Simon_Weaver Points 31141

Important: En cas d'échec 404 DownloadFileTaskAsync lancera une exception mais CRÉERA AUSSI un fichier vide. Cela peut être déroutant pour le moins!

Il m'a fallu beaucoup trop de temps pour me rendre compte que ce code créait un fichier vide en plus de lancer une exception:

await webClient.DownloadFileTaskAsync(new Uri("http://example.com/fake.jpg"), filename);

Au lieu de cela, je suis passé à ceci (DownloadDataTaskAsync au lieu de File):

 var data = await webClient.DownloadDataTaskAsync(new Uri("http://example.com/fake.jpg"));
 File.WriteAllBytes(filename, data);

*Je ne suis pas sûr du comportement pour les erreurs 500, mais pour sûr un 404 fait cela.

0voto

Andie2302 Points 846

J'utiliserais quelque chose comme ceci.

    public void Test()
    {
        try
        {
            WebClient webClient = new WebClient();
            webClient.DownloadString("");
        }
        catch (WebException webException)
        {
            if (int.TryParse(
                Regex.Match(webException.Message, @"(?<=error:\s\()\d+(?=\))", RegexOptions.Multiline).Value,
                out var result))
            {
                switch (result)
                {
                    case 404:
                        Console.WriteLine("Erreur 404");
                        break;
                    case 500:
                        Console.WriteLine("Erreur 500");
                        break;
                }
            }
        }
    }

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