Je n'arrive pas a gerer cette exception

Attila54 Messages postés 409 Date d'inscription jeudi 30 juin 2005 Statut Membre Dernière intervention 21 novembre 2013 - Modifié par Attila54 le 27/07/2013 à 17:20
 Utilisateur anonyme - 26 août 2013 à 18:56
Bonjour,
Voila, j'ai un petit souci avec ce bout de code qui me permets de me rendre sur un ftp externe et de télécharger des fichiers s'y trouvant

Private Sub download()
        Dim user As String = "monlogin"
        Dim password As String = "monpassword"
        Dim wc As New WebClient()
        wc.Credentials = New NetworkCredential(user, password)
        Dim baseUri = "ftp://ftp.cluster006.ovh.net/www/jdownloads/Patient/new_treatment/" 'URI et chemin ou je veux aller dans le ftp
        Dim newDirectory As String = "../done_treatment/"
        Dim fileNames = GetDirectoryListing(baseUri, wc.Credentials)
        Dim localpath As String = "\\nas\Calculateur\DATA\encours\" 'chemin ou je veux dl les fichiers
        For Each filename In fileNames
            Dim newPath As String = newDirectory + "/" + filename
            If Not filename.EndsWith(".xls", StringComparison.CurrentCultureIgnoreCase) Then 'ne tient pas compte de la casse
                Continue For
            End If
            Dim localFileName = System.IO.Path.Combine(localpath, filename)
            Dim uri = baseUri + "/" + filename
            wc.DownloadFile(uri, localFileName)
            MoveFile(uri, newPath, wc.Credentials) ' transfere le fichier dans done_treatment apres avoir downloade
        Next
        System.Threading.Thread.Sleep(1000)
        Labelprogress.Visible = False
        OvalShapeencours.Visible = False
        Labeldone.Visible = True
        OvalShapedone.Visible = True
        Me.Enabled = True
    End Sub


En effet, si le ftp n'est pas dispo, l'appli plante car l'exception n'est pas gérée. J'aurais bien voulu proceder de la manière suivante :
- Si au bout de 30 secondes pas de connectin, alors msgbox me disant
Délai de connexion dépassé" avec deux boutons en dessous
Quitter et réessayer
Si quitter alors je quitte l'appli
Si réessayer alors re tentative de lancement de la sub download

De même si le localpath ou le newdirectory ne sont pas accessibles ça plante carrément

Mais je crois que je vais avoir besoin d'un chouia d'aide car je rame un peu sur la façon de procéder. Je pensais a des try mais je ne maîtrise pas bien la chose
merci beaucoup

--

18 réponses

NHenry Messages postés 15113 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 22 avril 2024 159
Modifié par NHenry le 27/07/2013 à 19:43
Bonsoir,

Intéresses-toi aux mots clés : Try/Catch

Tout est dans la doc normalement.

Sinon, montre un de tes essais avec.
1
4u4me4us Messages postés 780 Date d'inscription lundi 22 janvier 2007 Statut Membre Dernière intervention 30 octobre 2013 3
12 août 2013 à 15:19
Le MoveFile(uri, newPath, wc.Credentials) doit être en dehors de la boucle for.
Je te conseillerais de mettre un sleep au début de la boucle (PAS A LA FIN)!

Le try catch est juste comme tu l'utilises.

Note que je n'est pas trouvé le moyen de mettre un timeout dans les paramétrés FTP.

--
1
Suite a des mauvaise aventure je ne mets pas de commandes après une commande ftp c pour quoi je te conseil de ne rien mettre (next non compris) après wc.DownloadFile(uri, localFileName)

Tjs par expérience je te conseille de mettre un petit temps mort entre chaque téléchargements.

Les deux raisons font que je te conseil de mettre le sleep en début de boucle et le move a l'extérieur de la boucle.

"...3 exceptions a gérer j'arrive pas a faire. .."

Tu peux mettre autant de catch que tu veux. exemple

Catch ex As Exception du serveur ftp
Catch ex As Exception du nas
Catch ex As Exception tous les autres cas
End Try

Chaque exceptions on un code. A toi de les trouver via google, msdn ou l'aide et de remplace le Exception par le code en question.
1
Attila54 Messages postés 409 Date d'inscription jeudi 30 juin 2005 Statut Membre Dernière intervention 21 novembre 2013 1
29 juil. 2013 à 14:16
merci de ta réponse nhenry, même si d'ailleurs je ne la vois plus sur le forum ....
J'ai mis dans d'autres séquences de code des try catch comme ici par exemple
Private Sub Chargecombobox()
        txtDocteur.Items.Clear()
        Using cmd As New OleDbCommand("SELECT * FROM PRATICIENS", con)
            Try
                con.Open()
                rd = cmd.ExecuteReader
                While rd.Read
                    txtDocteur.Items.Add(rd(0))
                End While
                con.Close()

            Catch ex As Exception
                ' en cas d'erreur après appui sur enter, affichage d'un message
                messageaff = "An error occurred during the reading access of the customers'list."
                infoaff = "Error Database access"
                MessageBox.Show(messageaff, infoaff, MessageBoxButtons.OK, MessageBoxIcon.Warning)
            End Try
        End Using
    End Sub


Mon souci présentement est de bien positionner la séquence (position du try et du catch), et de traduire en vb le francais suivant : "si après 30s le serveur ftp ne répond pas".
Cela me gène car j'ai 3 exceptions a gérer :
- pour baseUri
- pour newDirectory
- pour localpath
du coup j' m'emmêle dans les imbrications
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Attila54 Messages postés 409 Date d'inscription jeudi 30 juin 2005 Statut Membre Dernière intervention 21 novembre 2013 1
12 août 2013 à 11:48
bon j'ai essaye plusieurs versions mais aucune ne fonctionne car je n'arrive pas a gérer les 2 exceptions issues de :
wc.DownloadFile(uri, localFileName)
            MoveFile(uri, newPath, wc.Credentials)


a tous les coups c'est un souci de positionnement du try et du catch
0
Attila54 Messages postés 409 Date d'inscription jeudi 30 juin 2005 Statut Membre Dernière intervention 21 novembre 2013 1
12 août 2013 à 18:47
Ben c'est bien mon problème, j'ai pas de souci particulier pour gérer une exception par try/catch mais la, sur une seule sub, j'ai a gérer Le MoveFile, Le DownloadFile (par exemple si le ftp foire), et le localpath (si mon NAS a sauté par exemple) et la, 3 exceptions a gérer j'arrive pas a faire.

Au début de ma boucle le sleep ? tu veux dire juste après le
For Each filename In fileNames
?

Ça m'intéresserais de savoir pourquoi

Merci
0
Attila54 Messages postés 409 Date d'inscription jeudi 30 juin 2005 Statut Membre Dernière intervention 21 novembre 2013 1
Modifié par Attila54 le 19/08/2013 à 19:46
Re a tous,
alors j'ai fait cela :
Private Sub download()
        Dim user As String = "monlogin"
        Dim password As String = "monpassword"
        Dim wc As New WebClient()
        wc.Credentials = New NetworkCredential(user, password)
        Dim baseUri = "ftp://ftp.cluster002.ovh.net/www/jdownloads/monchemin/" 'URI et chemin ou je veux aller dans le ftp
        Dim newDirectory As String = "../done_treatment/"
        Dim fileNames = GetDirectoryListing(baseUri, wc.Credentials)
        Dim localpath As String = "\\monnas\monchemin\" 'chemin ou je veux dl les fichiers
        For Each filename In fileNames
            Try
Dim newPath As String = newDirectory + "/" + filename
            If Not filename.EndsWith(".xls", StringComparison.CurrentCultureIgnoreCase) Then 'ne tient pas compte de la casse
                Continue For
            End If
            Dim localFileName = System.IO.Path.Combine(localpath, filename)
            Dim uri = baseUri + "/" + filename
            wc.DownloadFile(uri, localFileName)
            MoveFile(uri, newPath, wc.Credentials) ' transfere le fichier dans done_treatment apres avoir downloade
Catch ex As WebException
    Select Case ex.Status
        Case WebExceptionStatus.Timeout
            MessageBox.Show("Délai de connection expiré")
        Case WebExceptionStatus.NameResolutionFailure
            MessageBox.Show("Impossible de résoudre le nom")
     End Select
End try
Next
        System.Threading.Thread.Sleep(1000)
        Labelprogress.Visible = False
        OvalShapeencours.Visible = False
        Labeldone.Visible = True
        OvalShapedone.Visible = True
        Me.Enabled = True
    End Sub


et testé en mettant volontairement des erreurs. Je n'ai pas de msgbox mais l'erreur se place maintenant dans la sub GetdirectoryListing() quej'ai essayé de try / catcher comme ceci :

Private Shared Function GetDirectoryListing(ByVal uri As String, ByVal credentials As ICredentials) As IList(Of String)
        Dim entries As New List(Of String)()
        Dim request = DirectCast(WebRequest.Create(uri), FtpWebRequest)
        If credentials IsNot Nothing Then
            request.Credentials = credentials
        End If
        request.Method = WebRequestMethods.Ftp.ListDirectory
         try
Using response = DirectCast(request.GetResponse(), FtpWebResponse),
                 stream = response.GetResponseStream(),
                 reader = New StreamReader(stream)
            Dim line As String = reader.ReadLine()
            While line IsNot Nothing
                 entries.Add(line)
            line = reader.ReadLine()
            End While
           Return entries
       Catch ex As webexception (mais la je ne sais pas trop quoi mettre)
    end try
    End Using
    End Function


Mon catch, j'ai essayé et essayé et réessayé mais je n'arrive pas a le positionner correctement pour chopper l'exception ....

Ais un peu avancé la ?
merci

ps : pour 4u4me4us, je tente déjà de régler la gestion des exceptions et je corrige selon tes recommandations en ce qui concerne Le MoveFile et le sleep
0
Attila54 Messages postés 409 Date d'inscription jeudi 30 juin 2005 Statut Membre Dernière intervention 21 novembre 2013 1
24 août 2013 à 10:38
Alors j'ai fait cela pour le timeout au cas ou l'url du Ftp serait bonne mais qu'il ne repondrait pas.

Private Sub download()
        Dim user As String = "monlogin"
        Dim password As String = "monpassword"
        Dim wc As New WebClient()
        wc.Credentials = New NetworkCredential(user, password)
        Dim baseUri = "ftp://ftp.cluster002.ovh.net/www/jdownloads/monchemin/" 'URI et chemin ou je veux aller dans le ftp
        Dim newDirectory As String = "../done_treatment/"
        Dim fileNames = GetDirectoryListing(baseUri, wc.Credentials)
        Dim localpath As String = "\\monnas\monchemin\" 'chemin ou je veux dl les fichiers
        For Each filename In fileNames
           System.Threading.Thread.Sleep(1000) 
           Try
Dim newPath As String = newDirectory + "/" + filename
            If Not filename.EndsWith(".xls", StringComparison.CurrentCultureIgnoreCase) Then 'ne tient pas compte de la casse
                Continue For
            End If
            Dim localFileName = System.IO.Path.Combine(localpath, filename)
            Dim uri = baseUri + "/" + filename
            wc.DownloadFile(uri, localFileName)
           Catch ex As WebException
    Select Case ex.Status
        Case WebExceptionStatus.Timeout
            MessageBox.Show("Délai de connection expiré")
        End Select
End try
Next
     MoveFile(uri, newPath, wc.Credentials) ' transfere le fichier dans done_treatment apres avoir downloade
 Me.Enabled = True
    End Sub


Vu que je ne contrôle pas le fait que le ftp fonctionne ou non, quelqu'un pourrait me dire si la sub est bonne ?

Merci
0
cet ligne me semble blizzards
Dim newPath As String = newDirectory + "/" + filename


Sauf erreur tu n'utilise pas newpath

ceci dit tout le reste me semble très bien !
0
salut
Le movefile est mal placé
il ne copie en local que le dernier FileName
0
Garce au commentaire de cs-Galain je crois avoir compris l'utilité de new path.
Si ton but est bien de créer un nouveau dossier alors la ligne
Dim newPath As String = newDirectory + "/" + filename
na rien a faire dans la boucle mais doit-être avant. Car il ne sert à rien de créer le dossier pour de l'écraser x fois.

puis pour reprendre cs-Galain , le move est bien placer mais ne compte qu'un fichier. Il faut le modifier pour que tous les fichiers dans le dossier "*" soient déplacer dans le dossier créer par newPath. Ceci est facilement trouvé sur le net.

Si j'ai bien compris l'utilisation de newPath bien-sure.
0
salut 4u4me4us

Dim newPath As String = newDirectory + "/" + filename doit être dans le boucle ! il est le chemin complet du nom de fichier en local !

Par contre le MoveFile doit être aussi dans la boucle !

Pour Attila : remplace les 2 Newpath par NewFile ! ce sera plus parlant

Path indique un chemin alors que File est un fichier en anglais
0
Attila54 Messages postés 409 Date d'inscription jeudi 30 juin 2005 Statut Membre Dernière intervention 21 novembre 2013 1
26 août 2013 à 14:03
bien compris, donc hormis le remplacement de newpath par newfile, ma sub initiale était correcte, le try / catch en plus

Private Sub download()
        Dim user As String = "monlogin"
        Dim password As String = "monpassword"
        Dim wc As New WebClient()
        wc.Credentials = New NetworkCredential(user, password)
        Dim baseUri = "ftp://ftp.cluster002.ovh.net/www/jdownloads/monchemin/" 'URI et chemin ou je veux aller dans le ftp
        Dim newDirectory As String = "../done_treatment/"
        Dim fileNames = GetDirectoryListing(baseUri, wc.Credentials)
        Dim localpath As String = "\\monnas\monchemin\" 'chemin ou je veux dl les fichiers
        For Each filename In fileNames
           System.Threading.Thread.Sleep(1000) 
           Try
Dim newPath As String = newDirectory + "/" + filename
            If Not filename.EndsWith(".xls", StringComparison.CurrentCultureIgnoreCase) Then 'ne tient pas compte de la casse
                Continue For
            End If
            Dim localFileName = System.IO.Path.Combine(localpath, filename)
            Dim uri = baseUri + "/" + filename
            wc.DownloadFile(uri, localFileName)
MoveFile(uri, newPath, wc.Credentials) ' transfere le fichier dans done_treatment apres avoir downloade           
Catch ex As WebException
    Select Case ex.Status
        Case WebExceptionStatus.Timeout
            MessageBox.Show("Délai de connection expiré")
        End Select
End try
Next
    Me.Enabled = True
    End Sub


est ce correct ?
0
Salut Attila
ta fonction GetDirectoryListing fonctionne-t-elle correctement ?
car elle aussi elle doit être Try- Catchée !
et il faudrait une variable qui t'indique si cette fonction s'est bien passée ou non !

Car si tu ne récupère pas la liste des fichiers sur le ftp plantage assuré !

Mo je mettrais GetDirectoryListing dans la sub Download() évidemment le code de cette fonction

Ainsi avec un seul Try Catch tu gères toutes les exceptions !
0
Salut Attila

A essayer sans garantie

1) Supprime la fonction GetDirectoryListing
2) mets ce code pour la fonction DownLoad()

en cas d'erreur sur la liste des fichiers on sort
en cas d'erreur sur le téléchargement d'un fichier on le repropose en téléchargement

regarde ces message dans le code : attention il y avait une virgule bizarre
j'ai un doute

 Private Sub download()

        Dim erreur As Boolean
        Dim user As String = "monlogin"
        Dim password As String = "monpassword"
        Dim wc As New WebClient()
        Dim baseUri = "ftp://ftp.cluster002.ovh.net/www/jdownloads/monchemin/" 'URI et chemin ou je veux aller dans le ftp
        Dim newDirectory As String = "../done_treatment/"
        Dim fileNames As List(Of String)
        Dim localpath As String = "\\monnas\monchemin\" 'chemin ou je veux dl les fichiers

        ' Importation de la liste des fichiers depuis le serveur FTP
        Try
            wc.Credentials = New NetworkCredential(user, password)
            Dim request = DirectCast(WebRequest.Create(baseUri), FtpWebRequest)
            If wc.credentials IsNot Nothing Then request.Credentials = wc.credentials
            request.Method = WebRequestMethods.Ftp.ListDirectory
            Using response = DirectCast(request.GetResponse(), FtpWebResponse) ' attention il y avait une virgule bizarre
                stream = response.GetResponseStream()  ' attention il y avait une virgule bizarre là aussi 
                reader = New StreamReader(stream)
                Dim line As String = reader.ReadLine()
                While line IsNot Nothing
                    fileNames.Add(line)
                    line = reader.ReadLine()
                End While
            End Using
            erreur = False
        Catch ex As Exception
            MessageBox.Show("Erreur " & ex.ToString & " lors de l'importation de la liste des fichiers")
            erreur = True
        End Try
        If erreur = True Then Exit Sub ' la liste n'a pas été téléchargée : on quitte 

        ' Télechargement des fichiers depuis le serveur FTP
        If fileNames.Count > 0 Then ' si la liste n'est pas vide
            For Each filename In fileNames
                If filename.EndsWith(".xls", StringComparison.CurrentCultureIgnoreCase) Then 'ne tient pas compte de la casse
                    ' c'est un fichier .xls ----> on essaie de le télécharger
                    Do
                        Application.DoEvents()
                        Try
                            Dim localFileName = System.IO.Path.Combine(localpath, filename)
                            Dim uri = baseUri + "/" + filename
                            wc.DownloadFile(uri, localFileName)
                            Dim newFile As String = newDirectory + "/" + filename
                            System.Threading.Thread.Sleep(1000)
                            MoveFile(uri, newFile, wc.Credentials) ' transfere le fichier dans done_treatment apres l'avoir téléchargé
                            erreur = False
                        Catch ex As Exception
                            MessageBox.Show("Erreur " & ex.ToString & " lors du téléchargement du fichier" & filename)
                            erreur = True
                        End Try
                        If erreur = True Then ' erreur : on propose de retélécharger à nouveau
                            Dim Reponse As Integer = MessageBox.Show("Voulez-vous retenter le téléchargement du fichier " & filename, "Attention", MessageBoxButtons.YesNo, MessageBoxIcon.Question)
                            If Reponse = DialogResult.No Then Exit Do ' on réponds non alors on sort et on téléchargele fichier suivant si il y a lieu
                        End If
                    Loop
                End If
            Next
        Else
            MessageBox.Show("Aucun fichier à télécharger : la liste sur le serveur est vide")
        End If

    End Sub
0
Utilisateur anonyme
26 août 2013 à 17:04
Salut cs-Galain,

WebClient propose des événements. C'est dommage de s'en passer...
A bientôt.
0
Salut banana32

Je ne connais pas du tout Webclient !
Je n'ai fait que reprendre le code d'Attila en le clarifiant au max et en tentant de le corriger !

tu peux proposer tes idées par contre !
0
Attila54 Messages postés 409 Date d'inscription jeudi 30 juin 2005 Statut Membre Dernière intervention 21 novembre 2013 1
Modifié par Attila54 le 26/08/2013 à 18:29
euh jusqu ici la sub et la fonction ont toujours fonctionnees, je voulais lever les exceptions justement pour éviter le crash au cas ou. Après j ai fait avec un peu d aide et mes maigres connaissances ...
--
0
Utilisateur anonyme
26 août 2013 à 18:56
Salut Attila54,

Je t'invite à lire la doc de WebClient sur msdn et surtout la partie concernant ses événements. Tu pourras alors supprimer tous tes blocs 'try/catch' (gourmands en ressources) et ainsi simplifier ton code.
0
Rejoignez-nous