For Loop ohne Ende?

  • VB.NET
  • .NET (FX) 4.0

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von razzzer530i.

    For Loop ohne Ende?

    Moin,

    folgender Code:

    VB.NET-Quellcode

    1. Private Sub Temp_Work()
    2. Debug.WriteLine("1")
    3. For i = 0 To arrTemp.Count - 1 Step 1
    4. Dim ts As cTempS = arrTemp(i)
    5. 'IP von Hostname
    6. If vblen.netwrk.Ping_Device(ts.hostname, 500) = True Then
    7. Try
    8. ts.ip = Dns.GetHostAddresses(ts.hostname)(0).ToString
    9. Catch
    10. End Try
    11. Else
    12. ts.errorstate = "Can't get IP from Hostname"
    13. End If
    14. If ts.ip.Length > 0 Then
    15. Dim regpat As String = "\b(0*(25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(0*(25[0-5]|2[0-4]\d|[01]?\d\d?))\b"
    16. Dim rgx As New Regex(regpat)
    17. If rgx.IsMatch(ts.ip) Then
    18. ts = Get_SensVal(ts)
    19. Else
    20. ts.errorstate = "IP Adresse ungültig"
    21. End If
    22. End If
    23. Next
    24. Debug.WriteLine("2")
    25. Debug.WriteLine("hier")
    26. End Sub


    cTempS ist ein Temperatursensor. Läuft auch alles gut. Allerdings kommt meine Schleife nicht durch und die "2" wird niemals geprintet.
    Ich bekomme bei der ping device Abfrage bei fehlerhaftem Host einen Error, den ich aber mit Try Catch Abfange:

    VB.NET-Quellcode

    1. ''' <summary>
    2. ''' Prüft, ob ein Gerät pingbar ist.
    3. ''' </summary>
    4. ''' <param name="IP">IP des Gerätes.</param>
    5. ''' <param name="timeout">Zeitabstand(in ms), den das Gerät zum Antworten auf den Ping hat.</param>
    6. ''' <returns></returns>
    7. Public Shared Function Ping_Device(ByVal IP As String, ByVal timeout As Integer) As Boolean
    8. Dim blnResult As Boolean = False
    9. Try
    10. If IP IsNot Nothing AndAlso IP IsNot "" Then
    11. If IP AndAlso My.Computer.Network.Ping(IP, timeout) Then
    12. blnResult = True
    13. End If
    14. End If
    15. Catch x As IOException
    16. debug.writeline(x.Message)
    17. End Try
    18. Return blnResult
    19. End Function


    Das Array enthält 2 Elemente. Was übersehe ich ? Bin ich blind? Ist doch nur eine einfache Schelife :cursing:
    ~Wir leben zwar alle unter dem gleichen Himmel, aber es haben nicht alle den gleichen Horizont~
    Ein paar zu viele Unbekannte für uns.
    Kannst Du bei Zeile#14 in Block#1 If ts.ip.Length > 0 Then überhaupt ip abfragen, wenn dem ganzen vorher nix zugeordnet wurde, weil ein Fehler aufgetreten ist?
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @Bluespide Ne das ganze wird in einem Backgroundworker ausgeführt. Ein Timer prüft alle 30 Sekunden, ob der bgw noch aktiv ist, falls nicht wird er gestarten. Im DoWork wird dann die Funktion ausgeführt.

    @VaporiZed Die IP Variable ist ein string. Die IP variable ist entweder eine IP als String oder eben "". Also ein leerer String.

    VB.NET-Quellcode

    1. Public Class cTempS
    2. Public Property userid As String = ""
    3. Public Property userpassword As String = ""
    4. Public Property sensorid1 As String = ""
    5. Public Property sensorid2 As String = ""
    6. Public Property ip As String = ""
    7. Public Property hostname As String = ""
    8. Public Property link As String = ""
    9. Public Property location As String = ""
    10. Public Property valsens1 As String = ""
    11. Public Property valsens2 As String = ""
    12. Public Property errorstate As String = ""
    13. End Class

    Bekomme ich keinen IP vom Hostnamen zurück, bleibt die IP also "".

    @VB1963
    Folgendes Problem tritt auf. Ich pinge einen Hostnamen den es scheinbar nicht gibt:

    VB.NET-Quellcode

    1. Public Shared Function Ping_Device(ByVal IP As String, ByVal timeout As Integer) As Boolean
    2. Dim blnResult As Boolean = False
    3. ' Try
    4. If IP IsNot Nothing AndAlso IP IsNot "" Then
    5. If IP AndAlso My.Computer.Network.Ping(IP, timeout) Then
    6. blnResult = True
    7. End If
    8. End If
    9. ' Catch x As IOException
    10. 'debug.writeline(x.Message)
    11. ' End Try
    12. Return blnResult
    13. End Function

    hier ist die IP jetzt z.B. Tempsenss1 (Diesen Hostnamen gibt es im Netzwerk nicht).
    Es kommt zum Fehler
    Ausnahme ausgelöst: "System.Net.NetworkInformation.PingException" in System.dll Zusätzliche Informationen: Während einer Pinganforderung ist eine Ausnahme aufgetreten.

    Ich vermute auch, dass es an diesem Fehler liegt, weiß aber trotz google nicht, wie ich das ganze Abfange.
    ~Wir leben zwar alle unter dem gleichen Himmel, aber es haben nicht alle den gleichen Horizont~
    Du hast zum Anfang in der Ping_Device-Funktion einen Try-Catch-Block gehabt, in der eine IOException abgefangen wird. Bei Dir kommt aber ne PingException. Die wird nicht abgefangen und damit scheitert das Ganze wohl. Von daher verwende in jener Function: Catch x As System.Net.NetworkInformation.PingException

    btw:
    • BGW ist obsolet. Heutzutage gibt es Async/Await
    • Mach mal bitte erstmal Option Strict On. Da IP ein String ist, ist in der Shared Function Ping_Device ist If IP AndAlso syntaktisch falsch.
    • Vergleiche mit True/False sind überflüssig: If vblen.netwrk.Ping_Device(ts.hostname, 500) = True Then -> If vblen.netwrk.Ping_Device(ts.hostname, 500) Then
    • For ... Step 1: Das "Step 1" ist überflüssig.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Hi,

    zuerst mach mal bitte Option Strict On. Ich verstehe nicht, warum Du nicht schon bei einem gültigen HostName eine Exception bekommst. Weil

    VB.NET-Quellcode

    1. Public Function Ping_Device(ByVal IP As String, ByVal timeout As Integer) As Boolean
    2. Dim blnResult As Boolean = False
    3. Try
    4. If IP IsNot Nothing AndAlso IP IsNot "" Then
    5. If My.Computer.Network.Ping(IP, timeout) Then
    6. blnResult = True
    7. End If
    8. End If
    9. Catch x As IOException
    10. Debug.WriteLine(x.Message)
    11. End Try
    12. Return blnResult
    13. End Function


    Du fängst nur eine IO.Exception. Diese wird hier aber nicht auftreten. Mögliche Exceptions, die hier auftreten können sind. InvalidCastException und PingException.

    Die InvalidCastException fliegt bei dieser Zeile:

    VB.NET-Quellcode

    1. ​If IP IsNot Nothing AndAlso IP IsNot "" Then


    IP ist vom Typ String und Du behandelst sie wie einen Boolean. Das ist giftig. Option Strict On hätte Dich darauf aufmerksam gemacht und der Fehler hätte gar nicht erst auftreten können, da Du gezwungen wärst, diesen zu beseitigen.

    Ich würde das Ganze mal umarbeiten (Option Strict On, nochmal überlegen). Hier ein kleines Beispiel:

    VB.NET-Quellcode

    1. Private Sub Temp_Work1()
    2. Dim arrTemp(1) As cTempS
    3. arrTemp(0) = New cTempS() With {.hostname = "XSpace"}
    4. arrTemp(1) = New cTempS() With {.hostname = "TestHostName"}
    5. For i As Integer = 0 To arrTemp.Length - 1
    6. Try
    7. Dim ping As New Ping()
    8. Dim result As PingReply = ping.Send(arrTemp(i).hostname, 50)
    9. arrTemp(i).ip = result.Address.ToString()
    10. Catch ex As PingException
    11. Continue For
    12. End Try
    13. Dim entry As IPHostEntry = Dns.GetHostEntry(arrTemp(i).hostname)
    14. arrTemp(i).ip = entry.AddressList.Where(Function(x) x.GetAddressBytes().ToList().GetRange(0, 3).SequenceEqual(New Byte() {192, 168, 178})).First().ToString()
    15. Next
    16. End Sub


    Es ist vollkommen ok, wenn man den Ping-Vorgang in ein Try-Catch packt, solange man die richtige Exception fängt. Hier kann im Grunde nur PingException auftreten. Passiert dies, dann ist der HostName nicht bekannt und es macht keinen Sinn, noch weiter zu machen. Darum wird im Catch-Block Continue aufgerufen. Hier wird sofort der nächste Schleifendruchlauf gestartet und der nachfolgende Code übersprungen. Gelingt die Pingabfrage, tritt mit einiger Sicherheit auch keine Exception bei Dns.GetHostEntry() auf. Ich bin mir nicht sicher, was Du mit dem RegEx-Pattern versuchst zu machen. Wenn Du die lokale IPV4-Adresse rausfinden willst, dann hab ich Dir im Code auch ein Beispiel dazu gemacht. Musst halt entsprechend Deines Adressmusters anpassen.
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o
    @VaporiZed

    VB.NET-Quellcode

    1. Try
    2. If vblen.netwrk.Ping_Device(ts.hostname, 500) = True Then
    3. ' Try
    4. ts.ip = Dns.GetHostAddresses(ts.hostname)(0).ToString
    5. ' Catch
    6. ' End Try
    7. Else
    8. ts.errorstate = "Can't get IP from Hostname"
    9. End If
    10. Catch ex As Net.NetworkInformation.PingException
    11. MsgBox(ex.Message)
    12. End try

    Hiermit kann ich die ex abfangen. Aber wieso wird er so früh abgebrochen.
    Wenn ich den Try Catch block in die Funktion packe:

    VB.NET-Quellcode

    1. Public Shared Function Ping_Device(ByVal IP As String, ByVal timeout As Integer) As Boolean
    2. Try
    3. Dim blnResult As Boolean = False
    4. If IP IsNot Nothing AndAlso Not IP = "" Then
    5. If IP AndAlso My.Computer.Network.Ping(IP, timeout) Then
    6. blnResult = True
    7. End If
    8. End If
    9. Return blnResult
    10. Catch ex1 As System.Net.NetworkInformation.PingException
    11. Return False
    12. End Try
    13. End Function

    dann bricht die Schleife ab und die Funktion gibt keinen Wert zurück.
    Kann ich das nicht so schreiben, dass die Funktion in jedem Fall das Handling für einen Fehler mitverarbeitet?
    Ich war mir eigentlich sicher, dass die Funktion so, wie jetzt oben beschrieben alles abfangen kann. Jedoch läuft es erst, wenn ich vor den Funktionsaufruf ein Try platziere...


    @SpaceyX Sorry hatte deinen Beitrag zu spät gesehen.

    Ok verstehe alles was du geschrieben hast.
    Ich verstehe aller dings folgende Aussage nicht so ganz:
    IP ist vom Typ String und Du behandelst sie wie einen Boolean. Das ist giftig. Option Strict On hätte Dich darauf aufmerksam gemacht und der Fehler hätte gar nicht erst auftreten können, da Du gezwungen wärst, diesen zu beseitigen.

    Wo mache ich das?
    ...Oh ich sehe gerade wo. Das sollte da so gar nicht stehen. DAs IF IP gehört da gar nicht hin.


    BTW ich verstehe deinen Ansatz völlig. Trotzdem fehlt mir da noch die Erkenntnis, wieso meine Funktion so nicht richtig läuft, da ich diese Abfrage sehr oft ausführe.
    Irritiert mich, dass er bevor ich überhaupt den Ping ausführe, raus fleigt 8|

    ~Wir leben zwar alle unter dem gleichen Himmel, aber es haben nicht alle den gleichen Horizont~

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „razzzer530i“ ()

    Bitte kümmer Dich um folgende wichtige Projekteinstellungen, sonst wird das hier ein Gefrickel, welches sich ein gutes Stück ersparen lässt:

    in der Ping_Device-Function ist das blnResult überflüssig. in Zeile#7 kannst Du einfach Return True schreiben, in Zeile#10 Return False. Da aber sowohl der Try-Teil ein Return enthält als auch der Catch-Teil, kann es nur noch sein, dass noch eine Exception auftritt, die nicht abgefangen wird. Daher brauchst Du eigentlich noch nach dem End Try ein Return False, ansonsten gibt das Ganze tatsächlich keinen Wert zurück. Aber das hatte ja SpaceyX schon geschrieben, dass da noch mehr zu erwarten ist.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    youtube.com/watch?v=ZRqFrd67UUU

    Das Video ist zwar schon ein bisschen älter, aber die Einstellung sollte auch in aktuelleren Versionen von VisualStudio noch da zu finden sein. Option Strict On ist wirklich fundamental. Hier auch noch ein kleiner Beitrag von mir zu dem Thema.

    https://www.vb-paradise.de/index.php/Thread/105413-Visual-Studio-Empfohlene-Einstellungen/?postID=908193#post908193

    Auch die anderen Hinweise in dem Beitrag sollte man beherzigen. Vor Allem, da Du My.Computer.Network.Ping nutzt. Es gibt bessere Möglichkeiten (wie im Code gezeigt)....
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o
    @SpaceyX

    Witzigerweise hatte ich Option strict immer an. Vor knapp 3 Monaten hatte ich einen totalen Crash und musste neu installieren. Da hab ich das doch glatt vergessen. Hatte das nie in den Code Header geschrieben, sondern immer in den Settings geändert.

    Problem behoben. Besten Dank! Habe das IP als Bool handle raus genommen und die richtige ex abgefangen. Läuft jetzt so, wie ich es mir vorgestellt habe.
    ~Wir leben zwar alle unter dem gleichen Himmel, aber es haben nicht alle den gleichen Horizont~