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 :

Pourquoi un try catch ne marche-t-il pas ?!?


Sujet :

VB.NET

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 44
    Points : 35
    Points
    35
    Par défaut Pourquoi un try catch ne marche-t-il pas ?!?
    Bonjour à tous,
    je me remets après un long passage à vide au basic ... et ai un probleme dans le code ci-dessous.
    Le principe : pour tester une connection ADSL envoyer un ping et, si il marche en déduire que la liaison est ok, sinon pinguer une deuxième et, si besoin une troisième avant de déduire que la connexion est HS.
    Le problème : quel que soit le résultat du ping (je deconnecte le pc par exemple), je ne catch jamais d'erreur!!
    Help, help ..
    Merci d'avance
    Eric

    Code :
    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
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
     
    Imports System
    Imports System.Threading
    Module pingctrlerreur
     
        Sub Main(ByVal cmdArgs() As String)
            Dim millisecondsTimeout As Integer
            Dim Connecte As Boolean
            Dim nouveaunom, vrainouveaunom As String
            Dim AdressesPing(3) As String
            Dim IpAddr As String
            Dim Ping As New Net.NetworkInformation.Ping
            Dim PingReply As Net.NetworkInformation.PingReply
            millisecondsTimeout = 30000
            Connecte = False
            If My.Computer.FileSystem.FileExists("test.txt") Then
                nouveaunom = "C" & DateString & TimeString & ".txt"
                vrainouveaunom = Replace(nouveaunom, ":", "")
                My.Computer.FileSystem.RenameFile("test.txt", vrainouveaunom)
            End If
            If cmdArgs.Length > 0 Then
                For argNum As Integer = 0 To UBound(cmdArgs, 1)
                    AdressesPing(argNum) = cmdArgs(argNum)
                Next argNum
            Else
                AdressesPing(0) = "194.2.0.50"
                AdressesPing(1) = "194.2.0.50"
                AdressesPing(2) = "194.2.0.50"
            End If
            My.Computer.FileSystem.WriteAllText("C:test.txt", _
            "PING sur " & AdressesPing(0) & " " & AdressesPing(1) & " " & AdressesPing(2) & " " & " le " & DateString & " " & " à " & TimeString & Chr(13), True)
            While True
                Try
                    ' On envoit la requete du ping
                    IpAddr = AdressesPing(0)
                    PingReply = Ping.Send(IpAddr)
                    ' si la connection est déjà connue, on ne fait rien sinon on la note dans le fichier
                    If Not Connecte Then
                        Connecte = True
                        My.Computer.FileSystem.WriteAllText("C:test.txt", "C" & "," & "1," & AdressesPing(0) & "," & DateString & "," & TimeString & Chr(13), True)
                    End If
                Catch ex As Exception
                    ' En cas d'erreur ping deuxieme IP
                    Try
                        ' On envoit la requete du ping
                        IpAddr = AdressesPing(1)
                        PingReply = Ping.Send(IpAddr)
                        ' On affiche le résultat du ping
                        ' tant que ça marche, on ne fait rien
                        ' si le ping ne marche pas le catch ex as exception doit prendre le controle
                    Catch ex1 As Exception
                        ' En cas d'erreur sur deuxieme IP ping troisieme IP
                        Try
                            ' On envoit la requete du ping
                            IpAddr = AdressesPing(2)
                            PingReply = Ping.Send(IpAddr)
                            ' On affiche le résultat du ping
                            ' tant que ça marche, on ne fait rien
                            ' si le ping ne marche pas le catch ex as exception doit prendre le controle
                        Catch ex2 As Exception
                            ' En cas d'erreur sur la troisième IP : 
                            ' si la deconnection est déjà connue on ne fait rien sinon 
                            ' on écrit la deconnection dans le fichier
                            ' et on note la déconnection
                            Connecte = False
                            My.Computer.FileSystem.WriteAllText("C:test.txt", "D,,," & DateString & " " & TimeString & Chr(13), True)
                        End Try
                    End Try
                End Try
     
                ' Pause de 15 seconde entre chaque ping
                System.Threading.Thread.Sleep(1000)
            End While
        End Sub
     
    End Module

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    127
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Mars 2007
    Messages : 127
    Points : 131
    Points
    131
    Par défaut
    Personnellement je trouve cela un peu bourrin de mettre trois try catch imbriqué dans un while, d'autant plus que si la connection existe, tu n'en sortiras jamais.
    Bref, ne serait-il pas mieux de faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    private function test_connection (byval ip as string)
    try
    return ping.send(ip)
    catch ex as exception
    return 0
    end try
    end function
    puis dans ton main :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    for i as integer = 0 to 2
       if test_connection = 0 then
       My.Computer.FileSystem.WriteAllText("C:test.txt", "D,,," & DateString & " " & TimeString & Chr(13), True)
       else
    My.Computer.FileSystem.WriteAllText("C:test.txt", "C" & "," & "1," & AdressesPing(0) & "," & DateString & "," & TimeString & Chr(13), True)
    next

  3. #3
    Expert éminent
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Points : 8 344
    Points
    8 344
    Par défaut
    ( juste en passant ... )

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 44
    Points : 35
    Points
    35
    Par défaut Try/catch ne marchent pas
    Je ne sais pas si c'est bourrin (lol) mais tu ne réponds pas à ma question!?
    Pourquoi ce catch ne marche pas!?
    Je pingue plusieurs IP parce que je pense qu'il ne suffit pas qu'une seule IP ne réponde pas pour en conclure qu'ADSL est out, ce peut être le site pingué qui est hs ?
    Merci de ton aide

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    127
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Mars 2007
    Messages : 127
    Points : 131
    Points
    131
    Par défaut
    Il y a une chose que je ne comprends pas
    tu veut tester trois fois la connection
    mais tu nous met ça dans un while dont on ne sors jamais si il n'y a pas de connection (véridique j'ai tester)
    Parce que tes try catch marchent

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    956
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 956
    Points : 1 199
    Points
    1 199
    Par défaut
    Bonjour,
    Il me semble curieux que la variable PingReply ne soit pas testée. Si tu fais un ping, et que celui ci ne fonctionne pas correctement il y a des chances que le reply.Status ne soit pas à IPStatus.Success or tu ne le teste pas!.

    Cordialement
    Soazig

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 44
    Points : 35
    Points
    35
    Par défaut Plein de questions et réponses
    Merci de toutes ces aides.
    Oui les ping sont dans une boucle sans fin .. c'est exprès .. je veux que ce programme note dans un fichier toutes les déconnection tant qu'il est lancé. Il ne va pas se décourager pour un malheureux ping qui ne marche pas .. Mais je pourrais quand Monsieur FAI me dira, je cite "vous exagérez votre connection est super", répondre : "Regardez tel(s) jour(s) à telle(s) heure(s) ma connection était (fort) probablement HS puisque ces trois ping ne marchaient pas. Je suis d'ailleurs tres étonné qu'un tel utilitaire n'existe pas encore (ou que je ne l'aie pas trouvé)!
    En ce qui concerne le test du code retour, je pensais que tout les erreurs quelles qu'elles soient, passaient par le catch .. d'ou cette absence de test .. je vais corriger.
    Enfin le catch : chez moi, en mode debug, je ne passe jamais dans le catch ?! Alors que, dans le module ci-dessous, cela marche!!
    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
     
    Public Class FrmPing
        Dim Ping As New Net.NetworkInformation.Ping
        Dim PingReply As Net.NetworkInformation.PingReply
        Private Sub BtnPing_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnPing.Click
            txtResultat.Clear()
                For i As Integer = 0 To 4
                Application.DoEvents()
                Try
                    ' On envoit la requete du ping
                    PingReply = Ping.Send(TxtIP.Text)
     
                    ' On affiche le résultat du ping
                    txtResultat.Text &= "Réponse de " & PingReply.Address.ToString & " : octets=" & PingReply.Buffer.Length & " temps=" & PingReply.RoundtripTime & " ms " & vbCrLf
                Catch ex As Exception
                    ' En cas d'erreur on affiche un message d'erreur
                    txtResultat.Text &= "Timeout (ou erreur lors du ping)" & vbCrLf
                End Try
     
                ' Pause de 1 seconde entre chaque ping
                System.Threading.Thread.Sleep(1000)
            Next
            Ping.Dispose()
            Ping = Nothing
            PingReply = Nothing
        End Sub
     
        Protected Overrides Sub Finalize()
            MyBase.Finalize()
        End Sub
    End Class
    Merci de continuer à m'aider malgré tout!
    Cordialement

  8. #8
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 177
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 177
    Points : 25 125
    Points
    25 125
    Par défaut
    l'instruction ping est elle au moins censée déclencher une erreur ??
    sinon c'est normal que t'en attrapes pas
    catch attrape les erreurs, genre mettre un string dans un integer

    de plus moi je verrais plutot un timer avec 5s d'interval
    avec dedans
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    if ping1 then exit sub
    if ping2 then exit sub
    if ping3 then exit sub
    écrit dans le fichier que aucun des 3 n'a marché à telle heure
     
     
    private function ping1() as boolean
      if le ping marche then return true
       sinon return false 
    end function

    sinon il faut bien pinger des ip et non des noms de domaine
    il faut aussi trouver plein d'ip sures, car un site peut très bien etre déconnecté alors que chez toi ca marche
    de plus, si le lien entre ton FAI et l'ip est HS, ca ne veut pas dire qu'entre toi et ton FAI ca plante
    et enfin si tu as FAI intelligent, il doit les enregistrer les déconnexions ...

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 44
    Points : 35
    Points
    35
    Par défaut
    Citation Envoyé par sperot51 Voir le message
    si tu as FAI intelligent, il doit les enregistrer les déconnexions ...
    si j'ai un FAI intelligent et de bonne foi! et un interlocuteur hotline consciencieux et ....

  10. #10
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 44
    Points : 35
    Points
    35
    Par défaut
    Citation Envoyé par sperot51 Voir le message
    l'instruction ping est elle au moins censée déclencher une erreur ??
    sinon c'est normal que t'en attrapes pas
    catch attrape les erreurs, genre mettre un string dans un integer

    de plus moi je verrais plutot un timer avec 5s d'interval
    avec dedans
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    if ping1 then exit sub
    if ping2 then exit sub
    if ping3 then exit sub
    écrit dans le fichier que aucun des 3 n'a marché à telle heure
     
     
    private function ping1() as boolean
      if le ping marche then return true
       sinon return false 
    end function

    sinon il faut bien pinger des ip et non des noms de domaine
    il faut aussi trouver plein d'ip sures, car un site peut très bien etre déconnecté alors que chez toi ca marche
    de plus, si le lien entre ton FAI et l'ip est HS, ca ne veut pas dire qu'entre toi et ton FAI ca plante
    et enfin si tu as FAI intelligent, il doit les enregistrer les déconnexions ...
    C'est la premiere solution (hormis la technique de programmation (la tienne est plus propre)) que j'ai essayée .. mais dans ce cas, certains non fonctionnements du ping produisent un abort du ping et, donc, du programme .. c'est pour éviter cela que j'ai essayé de récupérer les erreurs.

  11. #11
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 177
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 177
    Points : 25 125
    Points
    25 125
    Par défaut
    j'ai jamais utilisé la classe ping mais à priori elle retourne le résultat et c'est donc ce résultat que tu dois tester


    et selon reflector tu peux savoir parmis :

    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
    Public Enum IPStatus
        ' Fields
        BadDestination = &H2B0A
        BadHeader = &H2B22
        BadOption = &H2AFF
        BadRoute = &H2B04
        DestinationHostUnreachable = &H2AFB
        DestinationNetworkUnreachable = &H2AFA
        DestinationPortUnreachable = &H2AFD
        DestinationProhibited = &H2AFC
        DestinationProtocolUnreachable = &H2AFC
        DestinationScopeMismatch = &H2B25
        DestinationUnreachable = &H2B20
        HardwareError = &H2B00
        IcmpError = &H2B24
        NoResources = &H2AFE
        PacketTooBig = &H2B01
        ParameterProblem = &H2B07
        SourceQuench = &H2B08
        Success = 0
        TimedOut = &H2B02
        TimeExceeded = &H2B21
        TtlExpired = &H2B05
        TtlReassemblyTimeExceeded = &H2B06
        Unknown = -1
        UnrecognizedNextHeader = &H2B23
    End Enum

  12. #12
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 44
    Points : 35
    Points
    35
    Par défaut Test de la réponse du ping
    Comme tu me le suggère, j'essaie de tester la réponse du ping mais n'y arrive pas ....
    Un probleme de type que je n'arrive pas à résoudre (pingreply ne peut etre converti ni en integer ni en booleen ni en ...
    Bref comment le tester ??
    Merci d'avance
    Cordialement

  13. #13
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 177
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 177
    Points : 25 125
    Points
    25 125
    Par défaut
    l'objet pingreply est une classe et donc il faut faire .Status pour avoir la réponse as integer (enfin as enum)
    et avec tostring ca te donne le texte

    je viens d'essayer ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Dim p As New System.Net.NetworkInformation.Ping
    MsgBox(p.Send("google.fr").Status.ToString)
    et moi le messagebox me reponds "timedout", étant sur un réseau interdisant les départ de ping apparement (ou alors on peut pas mettre de nom de domaine)



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if PingReply.Status <> Success then enregistre_dans_fichier PingReply.Status.ToString

  14. #14
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 44
    Points : 35
    Points
    35
    Par défaut ça marche!
    Bonjour et merci à tous.
    ça marche et je tiens à la dispo de tous le petit programme qui toutes les 30 secondes pingue le réseau et note connection et déconnections dans un fichier pour permettre d'avoir une trace di comportement de son ADSL. J'ai expérimenté cela avec le représentant de mon FAI, le fait de pouvoir lui donner la liste des coupures et reconnections impressionne favorablement .. et aide à trouver des solutions.
    Merci de vos aides.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 01/06/2015, 17h20
  2. Réponses: 6
    Dernier message: 27/10/2010, 14h06
  3. Try Catch en Qt : Comment ca marche ?
    Par FBRUGEL dans le forum Qt
    Réponses: 1
    Dernier message: 23/09/2009, 14h24
  4. [try-catch] relancer les instruction du bloc try
    Par nounou dans le forum Langage
    Réponses: 11
    Dernier message: 12/05/2004, 11h23
  5. Exception & Try..catch
    Par PurL dans le forum C++Builder
    Réponses: 2
    Dernier message: 11/12/2002, 15h35

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