IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

Gestion de plusieurs exceptions dans une sub


Sujet :

VB.NET

  1. #1
    Membre habitué
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Juin 2005
    Messages
    608
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Santé

    Informations forums :
    Inscription : Juin 2005
    Messages : 608
    Points : 145
    Points
    145
    Par défaut Gestion de plusieurs exceptions dans une sub
    Bonjour,
    J'ai la sub suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    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
    Comme je reprends un peu la prog de ce soft, je teste un peu les sub et celle la ne me plait pas car :
    - Si pour une raison ou une autre, le ftp ou le localpath ou le newdirectory sont morts, l'appli plantera faute de gestion d'exceptions.
    J'ai pensé a des try/catch comme cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    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 ......... (gestion de l exception si timeout du ftp)
    Catch ex as ......... (gestion de l exception si le localpath plante)
    Catch ex as ......... (gestion de l exception si le newdirectory plante)
    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
    [/CODE]

    Je ne parviens toutefois pas a trouver comment syntaxer les catch (notament pour le ftpwebresponse) bien qu'ayant cherche sur msdn, google et pas mal d'autres sources.

    Pourrais je savoir :
    si ma structure est correcte et éventuellement avoir une petite aide pour mon catch ftpwebresponse ?

    merci bien

  2. #2
    Membre éclairé
    Homme Profil pro
    Technicien bio médical
    Inscrit en
    Décembre 2012
    Messages
    328
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien bio médical
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2012
    Messages : 328
    Points : 768
    Points
    768
    Par défaut
    Bonsoir,

    Il existe l'objet WebException. En l'utilisant de la sorte, on peut faire déjà pas mal de choses :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Catch ex As WebException
        Select Case ex.Status
            Case WebExceptionStatus.Timeout
                MessageBox.Show("La connection vers le serveur est en mousse")
            Case WebExceptionStatus.NameResolutionFailure
                MessageBox.Show("Impossible de résoudre le nom")
            Case ...
        End Select
    Pour ce qui est des fichiers et des dossiers, il vaut mieux à mon goût vérifier leur existence avant de faire les manipulations. System.IO regorge de méthodes pour le faire autant ne pas s'en priver.
    est ton amis, MSDN est ton maître, pour le reste il y a Developpez.net. Pensez au au et

  3. #3
    Membre du Club Avatar de anasschiguer
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2013
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2013
    Messages : 35
    Points : 62
    Points
    62
    Par défaut
    Bonjour,
    est ce que si tu as le nom des exceptions correspondant tu n'aura plus de problèmes ??
    Si c'est le cas tu peux executer le code avec try catch
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
            Try
            Catch ex As Exception
                MsgBox(ex.ToString)
                MsgBox(ex.Message)
            End Try
    ensuite tu dois provoquer les erreurs dont tu as parlé mais tu n'en a pas de détails. la première msgbox contiendra le nom de ton exception t u peux le récuperer et mettre ( si tu veux faire des traitements relatives au type d'exception rencontré)
    la première msgbox contiendra le nom de ton exception que tu peux inserer devant le catch approprié.
    Il est a noté que tu peux ajouter a la fin un catch ex as Exception, au cas ou nul des trois en haut n'a été la source de l'exception. Sinon pour les multiples catch, tu dois seulement s'assurer que tous les blocs peuvent être atteint (càd par exemple ArithmeticException hérite de Exception, donc tu dois mettre le bloc ArithmeticException avant celui de Exception )
    D'autre part si c'est le meme traitement que tu vas executer lors de la rencontre d'une Exception ou de l'autre (poursuivre l'application par exemple comme tu l'as précisé), un simple bloc Try catch te suffira sans se meler de sa vrai source.
    Pensez à voter ou ou de mettre si ma réponse le mérite

  4. #4
    Membre expérimenté Avatar de callo
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Février 2004
    Messages
    887
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Togo

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Service public

    Informations forums :
    Inscription : Février 2004
    Messages : 887
    Points : 1 699
    Points
    1 699
    Par défaut
    Je suis d'accord avec Rainui pour le WebException: http://msdn.microsoft.com/fr-fr/library/ez801hhe.aspx.
    Autre piste à vérifier:
    Code vb.net : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    Try
        '.................
     
    Catch ex1 As HttpListenerException
        MessageBox.Show("Download Error: error Accessing" + Uri + "-" + ex1.Message)
    Catch ex2 As WebException
        ' à gérer avec la méthode de Rainui
    Catch ex3 As System.IO.DirectoryNotFoundException
        ' Let the user know that the directory did not exist.
         MessageBox.Show("Directory not found: " + ex3.Message)  
    Catch ex As Exception
        MessageBox.Show(ex.Message)
    End Try
    N'oubliez pas le tag et

  5. #5
    Membre habitué
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Juin 2005
    Messages
    608
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Santé

    Informations forums :
    Inscription : Juin 2005
    Messages : 608
    Points : 145
    Points
    145
    Par défaut
    merci pour vos conseils, dans un premier temps je veux essayer de gérer l'exception due a la connexion ftp a savoir si le ftp est injoignable.

    Les paramètres d’accès et de connexion étant "en dur" dans la sub, mon but est de gérer le timeout (si ça ne répond pas au bout de X secondes) avec une messagebox retry/cancel

    Et c'est très bête mais je n'etais pas arrivé a trouver les différentes choses qu'on peut faire avec webexception (.timeout, etc ...) maintenant c fait

  6. #6
    Membre habitué
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Juin 2005
    Messages
    608
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Santé

    Informations forums :
    Inscription : Juin 2005
    Messages : 608
    Points : 145
    Points
    145
    Par défaut
    bon, j'ai testé quelques configurations notamment :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    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://monadresse/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
            Dim localpath As String = "D:\Test\" '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("La connection vers le serveur est dépassée")
            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
    hormis le fait que je ne sois absolument pas sur de la position du try/catch, j'ai volontairement modifié l' URI du serveur et mon mot de passe.

    Mon erreur se situe ici :



    donc dans la sub getdirectorylisting()

    Je me perds un peu la

  7. #7
    Membre expérimenté Avatar de callo
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Février 2004
    Messages
    887
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Togo

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Service public

    Informations forums :
    Inscription : Février 2004
    Messages : 887
    Points : 1 699
    Points
    1 699
    Par défaut
    Tu dois aussi "catcher" les exceptions dans ta procédure GetDirectoryListing en suivant le même principe suggéré par Rainui.
    N'oubliez pas le tag et

  8. #8
    Membre habitué
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Juin 2005
    Messages
    608
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Santé

    Informations forums :
    Inscription : Juin 2005
    Messages : 608
    Points : 145
    Points
    145
    Par défaut
    c'est ce que j'essaye de faire, mais quelque soit l'endroit ou je pose le catch, ça ne fonctionne pas du tout, comme si je ne "choppais" pas l'erreur ...

  9. #9
    Membre expérimenté Avatar de callo
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Février 2004
    Messages
    887
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Togo

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Service public

    Informations forums :
    Inscription : Février 2004
    Messages : 887
    Points : 1 699
    Points
    1 699
    Par défaut
    Pourrais-tu poster les codes des procédures download et GetDirectoryListing?
    N'oubliez pas le tag et

  10. #10
    Membre habitué
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Juin 2005
    Messages
    608
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Santé

    Informations forums :
    Inscription : Juin 2005
    Messages : 608
    Points : 145
    Points
    145
    Par défaut
    bien sur, voila la sub download

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    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 voila la fonction GetDirectoryListing

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    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
            Using response = DirectCast(request.GetResponse(), FtpWebResponse),
                     stream = response.GetResponseStream(),
                     reader = New StreamReader(stream)
                Dim line As String = reader.ReadLine()
                While line IsNot Nothing
     
         try
                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
    en te remerciant par avance

  11. #11
    Membre expérimenté Avatar de callo
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Février 2004
    Messages
    887
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Togo

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Service public

    Informations forums :
    Inscription : Février 2004
    Messages : 887
    Points : 1 699
    Points
    1 699
    Par défaut
    Tu as bien posté le code mais il ne contient pas les try ... catch. Pourrais-tu éditer ton post et les mettre?
    N'oubliez pas le tag et

  12. #12
    Membre éclairé
    Homme Profil pro
    Technicien bio médical
    Inscrit en
    Décembre 2012
    Messages
    328
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien bio médical
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2012
    Messages : 328
    Points : 768
    Points
    768
    Par défaut
    Bonjour,
    Si je peux me permettre, vous ne devriez pas mettre en dur URL, les noms d'utilisateurs et les mot de passe. Vous devriez plutôt utiliser les paramètres d'application et y accéder par My.Settings.(...)

    Je n'ai pas testé le code suivant mais ça peut vous donner une idée pour placer les Try / Catch ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
     
    Public Function GetFTPDirectory(ByVal _FTPUri As String, ByVal _Credential As NetworkCredential) As List(Of String)
     
            Dim result As New List(Of String)
            Dim _Request As FtpWebRequest = WebRequest.Create(_FTPUri)
     
            With _Request
                .Credentials = _Credential
                .Method = WebRequestMethods.Ftp.ListDirectory
            End With
     
            Try
                Dim _ResponseStream As Stream = _Request.GetRequestStream()
                Dim _ReponseStreamReader As New StreamReader(_ResponseStream)
                While Not _ReponseStreamReader.EndOfStream
                    result.Add(_ReponseStreamReader.ReadLine)
                End While
                Return result
            Catch ex As WebException
                MessageBox.Show(ex.Message)
                Return Nothing
            End Try
        End Function
     
        Public Function FTPDownLoadXLSFiles(ByVal _FTPUri As String, ByVal _Credential As NetworkCredential, ByVal _LocalDownLoadFolder As String, Optional ByVal _MoveFileAfterDownLoad As Boolean = True) As List(Of String)
            Dim _Wc As New WebClient
            _Wc.Credentials = _Credential
            Dim _DownloadedFiles As New List(Of String) 'permettra de stocker les noms de fichiers téléchargés
            'On filtre la liste des fichiers pour ne récupérer que les extensions .xls
            Dim result As List(Of String) = From _File As String In GetFTPDirectory(_FTPUri, _Credential) Select _File Where _File.EndsWith(".xls", StringComparison.CurrentCultureIgnoreCase)
            'Pour chaque fichier, vérifie que le fichier n'existe pas dans le dossier de destination
            For Each _File As String In result.ToList
                Try
                    Dim _LocalFileURI As String = Path.Combine(_LocalDownLoadFolder, _File)
                    Dim _FTPFileUri As String = Path.Combine(_FTPUri, _File)
     
                    If File.Exists(_LocalFileURI) Then
                        If MessageBox.Show("Le fichier " & _File & " est déjà présent dans le dossier " & _LocalDownLoadFolder _
                                        & ". Voulez vous le remplacer?", "Le fichier existe déjà", MessageBoxButtons.YesNo, _
                                        MessageBoxIcon.Exclamation) = Windows.Forms.DialogResult.Yes Then
                            'si l'utilisateur clique sur OUI, on efface le fichier
                            File.Delete(_LocalFileURI)
                        Else
                            'Si non, on le déplace vers un dossier d'archive
                            File.Move(_LocalFileURI, My.Settings.DownloadArchive)
                        End If
                    End If
     
                    _Wc.DownloadFile(_FTPFileUri, _LocalFileURI)
                    _DownloadedFiles.Add(_LocalFileURI)
     
                    If _MoveFileAfterDownLoad Then
                        'On exécute la procédure de déplacement
                    End If
     
                Catch ex As FileNotFoundException
                    MessageBox.Show(ex.Message)
                Catch ex As WebException
                    MessageBox.Show(ex.Message)
                    Exit Try
                End Try
            Next
            Return _DownloadedFiles
        End Function
    Bon code.
    est ton amis, MSDN est ton maître, pour le reste il y a Developpez.net. Pensez au au et

  13. #13
    Membre habitué
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Juin 2005
    Messages
    608
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Santé

    Informations forums :
    Inscription : Juin 2005
    Messages : 608
    Points : 145
    Points
    145
    Par défaut
    bien sur que tu peux te permettre, bien au contraire.
    Avant de tester ta méthode qui me parait nettement supérieure, je voudrais toutefois bien comprendre l'articulation de cette gestion de try/catch
    pour download() et GetdirectoryListing(), j'ai édité mon post précédant mais pas pu tester, je n'ai pas la station qui exécute VS2012 pour l'instant.

    Puis je savoir si ça semble correct ou pas

    Merci a vous

  14. #14
    Membre éclairé
    Homme Profil pro
    Technicien bio médical
    Inscrit en
    Décembre 2012
    Messages
    328
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien bio médical
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2012
    Messages : 328
    Points : 768
    Points
    768
    Par défaut
    Bonjour,

    La syntaxe Try / Catch permet de gérer les erreurs comme cité Ici

    Ainsi, le code suivant n'a, à mon avis, pas besoin d'être englobé dans un Try / Catch :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    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
    Ce code n'est que de simples manipulations de chaînes. Vous ne testez pas l’existence de fichiers, n'essayez pas d'accéder à internet, ...

    Par contre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    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)
    Dans ce bout de code, vous essayez d'accéder à un fichier sur un serveur FTP. Dans ce cas là, il est intéressant de savoir pourquoi ça plante (si ça plante)
    Le placement de votre Try / Catch me semble être bon pour la procédure download.
    La seule chose qu'il manquerait à mon goût c'est de vérifier si le fichier local n'existe pas déjà dans le dossier download. Auquel cas, il vaudrais mieux implémenter en plus une gestion d'erreur de fichier.

    Pour la fonction GetDirectoryListing :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    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
    Rien de particulier.
    Là par contre, je ne suis pas d'accord avec vous sur le placement du Try / Catch :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Using response = DirectCast(request.GetResponse(), FtpWebResponse),
                     stream = response.GetResponseStream(),
                     reader = New StreamReader(stream)
                Dim line As String = reader.ReadLine()
    Vous demandez la réponse au serveur FTP, si celui ci n'est pas joignable, vous n'aurez pas la raison. Pareil pour la lecture du StreamReader.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    try
                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
    Le Try / Catch à cet endroit ne sert à rien et line=reader.ReadLine() me semble pas non plus être au bon endroit
    Aucune WebException ne sera levée dans ce bout de code.
    est ton amis, MSDN est ton maître, pour le reste il y a Developpez.net. Pensez au au et

  15. #15
    Membre habitué
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Juin 2005
    Messages
    608
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Santé

    Informations forums :
    Inscription : Juin 2005
    Messages : 608
    Points : 145
    Points
    145
    Par défaut
    je pense alors qu'il faut que je place mon try juste avant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Using response = DirectCast(request.GetResponse(), FtpWebResponse),
    . Par contre le catch ne peut visiblement pas se positionner entre le using et le end using et encore moins après le end using. Donc la je suis vraiment perdu sur ce catch la

    pour l’implémentation de l'erreur en cas de doublon, j'ai adapté ton bout de code (et je t'en remercie)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    If File.Exists(_LocalFileURI) Then
                        If MessageBox.Show("Le fichier " & _File & " est déjà présent dans le dossier " & _LocalDownLoadFolder _
                                        & ". Voulez vous le remplacer?", "Le fichier existe déjà", MessageBoxButtons.YesNo, _
                                        MessageBoxIcon.Exclamation) = Windows.Forms.DialogResult.Yes Then
                            'si l'utilisateur clique sur OUI, on efface le fichier
                            File.Delete(_LocalFileURI)
                        Else
                            'Si non, on le déplace vers un dossier d'archive
                            File.Move(_LocalFileURI, My.Settings.DownloadArchive)
                        End If
                    End If
    J'attends de pouvoir accéder a la station VS2012 pour tester

    Alors pour la gestion des fichiers cela fonctionne
    Par contre j'arrive toujours pas a mettre le catch au bon endroit dans la sub GetdirectoryListibg()

Discussions similaires

  1. gestion plusieurs boutons dans une seule image
    Par bouchra19 dans le forum Mise en page CSS
    Réponses: 2
    Dernier message: 15/05/2012, 14h33
  2. Gestion des Exceptions dans une librairie
    Par Gat- dans le forum C#
    Réponses: 4
    Dernier message: 23/03/2011, 09h31
  3. Gestion d'exception dans une procédure stockée
    Par ramone dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 30/09/2010, 18h58
  4. [ZF 1.10] Gestion de toutes les exceptions dans une classe
    Par r-zo dans le forum Zend Framework
    Réponses: 1
    Dernier message: 19/06/2010, 01h23
  5. Réponses: 0
    Dernier message: 07/11/2009, 11h46

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo