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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    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
    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 émérite
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2012
    Messages
    337
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2012
    Messages : 337
    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.

  3. #3
    Membre éclairé 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
    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.

  4. #4
    Membre Expert 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
    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

  5. #5
    Membre éclairé
    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
    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 éclairé
    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
    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 Expert 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
    Par défaut
    Tu dois aussi "catcher" les exceptions dans ta procédure GetDirectoryListing en suivant le même principe suggéré par Rainui.

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