Wie prüfe ich Array vor der Verarbeitung auf Fehler?

  • EDIT:
    Fehler: Array mit falschem Inhalt, wenn keine Netzwerkverbindung
    Programm: Mein Skript liest Daten von einem Html Server in ein array ein.
    Wenn die Netzwerkverbindung nicht besteht, bricht das Programm mit einem Fehler ab.
    Wie kann man eine Abfrage machen, die sicherstellt, dass der Inhalt des arrays der richtige ist
    (und im anderen Fall eine Fehlermeldung ausgibt)?

    [autoit]


    Der Code läuft wenn Verbindung besteht.
    wenn nicht:>"C:\Programme\Eigene\AutoIt3\SciTE\..\autoit3.exe" /ErrorStdOut "D:\...check3.au3"
    D:\...check3.au3 (27) : ==> Array variable has incorrect number of subscripts or subscript dimension range exceeded.:
    $traffic = $array[3][2]
    $traffic = ^ ERROR
    >Exit code: 1Time: 56.104

    [/autoit]

    Deutung: Inhalt des arrays ist dann nicht:
    [0]| |Rang |GB Gesamt |GB gesendet |GB empfangen

    Spoiler anzeigen


    [1]|Verbindungen ins Internet |528 |1.954140 |0.077402 |1.876738
    [2]|Verbindungen über den Proxy |0 |0.000000 |0.000000 |0.000000
    [3]|Gesamt |637 |1.954140 |0.077402 |1.876738


    sondern folgendes:
    [0]| |Die Webseite kann nicht angezeigt werden.

    Spoiler anzeigen


    [1]| |
    [2]| |Wahrscheinlichste Ursachen:
    Sie haben keine Verbindung mit dem Internet hergestellt.
    Es ist ein Problem mit der Website aufgetreten.
    Die Adresse enthält eventuell einen Tippfehler.
    [3]| |Mögliche Vorgehensweise:
    [4]| | Überprüfen Sie die Internetverbindung. Besuchen Sie eine andere Website, um sicherzustellen, dass eine Verbindung besteht.
    [5]| | Geben Sie die Adresse erneut ein.
    [6]| | Wechseln Sie zur vorherigen Seite.
    [7]| | Weitere Informationen

    Das Problem kann aus verschiedenen Gründen aufgetreten sein:
    Die Internetkonnektivität ist verloren gegangen.
    Die Website ist temporär nicht verfügbar.
    Der Domänennamenserver (DNS) ist nicht erreichbar.
    Der Domänennamenserver (DNS) verfügt über keinen Eintrag für die Domäne der Website.
    Wenn dies eine (sichere) HTTPS-Adresse ist, dann klicken Sie auf "Extras", "Internetoptionen", "Erweitert" und stellen Sie sicher, dass die SSL- und TLS-Protokolle im Sicherheitsabschnitt aktiviert sind.
    Für Offlinebenutzer
    Sie können weiterhin Feeds und einige vor kurzem angezeigte Webseiten anzeigen.
    Gehen Sie folgendermaßen vor, um abonnierte Feeds anzuzeigen:
    Klicken Sie auf Favoritencenter , auf Feeds und anschließend auf den Feed, den Sie anzeigen möchten.
    Gehen Sie folgendermaßen vor, um vor kurzem angezeigte Webseiten anzuzeigen (funktioniert eventuell nicht für alle Seiten):
    Klicken Sie auf das Menü Extras und anschließend auf Offlinebetrieb.
    Klicken Sie auf Favoritencenter , auf Verlauf und anschließend auf die Seite, die Sie anzeigen möchten.


    Was nicht funktioniert ist:

    [autoit]

    If $IPgateway = "1.2.3.4" Then ;Verhindern dass das Programm einfriert, wenn Verbindung gesperrt
    $neterror = 1
    $Ausgabe = "Info: " & @HOUR & ":" & @MIN & ":" & @SEC & " Uhr" & @CRLF & "Die Verbindung zum Internet wurde zum Schutz vor einer Überschreitung des Übertragungsvolumens unterbrochen."
    GUICtrlSetData($Edit, $Ausgabe)
    $Minutes=$sleeptime5 ; 24h: Bis zur nächsten Überprüfung. Monatserster am besten oder alle 24h

    [/autoit][autoit][/autoit][autoit]

    Else ;Prüfung, ob im Internet, Google dauert zu lange

    [/autoit][autoit][/autoit][autoit]

    $end = 0
    $wdh = 20 ;wiederholungen
    While $end <= $wdh;überprüft 20x alle 37 sec. auf Verbindung zum Router

    [/autoit][autoit][/autoit][autoit]

    If $wdh = 0 Then;beim 21. Mal ohne Verbindung: 24h schlafen
    $Minutes = $sleeptime5
    $Ausgabe = "Info: " & @HOUR & ":" & @MIN & ":" & @SEC & " Uhr" & "Ein Fehler ist aufgetreten: " & @CRLF
    $Ausgabe &= "Es besteht keine Verbindung zum Internet. Bitte Netzwerkkabel prüfen. Nächste Überprüfung in: 24 Stunden." ;Besser Countdown anzeigen
    GUICtrlSetData($Edit, $Ausgabe)
    ExitLoop
    Endif
    $wdh = $wdh - 1

    [/autoit][autoit][/autoit][autoit]

    ;Überprüft ob im Netzwerk
    $var=Ping("www.google.de", 50)
    If @error = 4 Then
    $neterror = 2; Nicht im internet
    $Ausgabe = "Fehler um " & @HOUR & ":" & @MIN & ":" & @SEC & " Uhr " & @CRLF
    $Ausgabe &= "Es besteht keine Verbindung zum Internet. Bitte Netzwerkkabel prüfen."
    GUICtrlSetData($Edit, $Ausgabe)
    $Minutes= 0.6

    [/autoit][autoit][/autoit][autoit]

    Else;Dann ist alles in Ordnung
    ;Msgbox(0,"Status","Alles super: An error occured with number: " & @error)

    [/autoit][autoit][/autoit][autoit]

    check()

    [/autoit]

    Einmal editiert, zuletzt von Poloshirt (28. Juli 2009 um 21:43)

    • Offizieller Beitrag

    Du hast genau den Code weggelassen, der notwendig ist um dein Problem zu finden - nämlich die Erstellung/Befüllung des Array.
    Dieser Zugriff: $traffic = $array[3][2] verweist laut Fehlermeldung auf einen Bereich außerhalb des Arrays. Zeile4/Spalte3 gibt es also nicht. Das Array hat weniger Zeilen od. Spalten laut Fehlermeldung. Dort mußt du also deine Überprüfung ansetzen.

  • EDIT:
    Wenn die Verbindung steht, ist das Array groß genug. Wenn nicht, wird die Fehlermeldung vom IE ins array eingelesen und diese hat einen ganz anderen Inhalt.
    Wie kann man das Verhindern? Wie kann man sicherstellen, dass das Array den richtigen Inhalt hat?
    Frage: Wie kann man das Array vor der Verarbeitung auf Fehler prüfen?

    [autoit]

    #include <array.au3>
    #include <IE.au3>
    Global $traffic

    [/autoit][autoit][/autoit][autoit]

    check()
    MsgBox(4096,"Error", $traffic, 10)

    [/autoit][autoit][/autoit][autoit]

    Func check () ;Funktion die einmal den Traffic ausliest
    ;Voraussetzung: ist alles in Ordnung
    ;Msgbox(0,"Status","An error occured with number: " & @error)
    Local $url = 'hier steht die url, die nur über intranet zugänglich ist'
    Local $oIE = _IECreate($url, 0, 0)
    Local $oTable = _IETableGetCollection($oIE, 0)
    Local $array = _IETableWriteToArray($oTable, True) ; liest Tabelle in einen 2D-Array

    [/autoit][autoit][/autoit][autoit]

    If Not IsArray($array) Then Exit MsgBox(0,"Fehler","Array wurde nicht geladen") ;hilft nicht wenn es ein array gibt.

    [/autoit][autoit][/autoit][autoit]

    ;_ArrayDisplay($array)
    If ( Not IsArray($array) ) Then;wenn kein Array wird Error=1 gesetzt
    SetError(1)
    ;Return 0
    EndIf
    ;~ If ( $array[3][2] < 0 ) Or ( $array[3][2] > UBound($array)-1 ) Then; wenn Die Trafficzahl keine Zahl ist soll Error=2 gesetzt werden
    ;~ SetError(2);funktioniert nicht weil array nicht definiert in diesem falle
    ;~ Return 0
    ;~ EndIf
    If @error Then
    MsgBox(4096,"Error", "PC ist nicht mit dem UNI-Netz verbunden", 10) ; if abfrage voranstellen um zu klären ob überschreitung, Msg box automatisch schließen nach 10 sec.
    Else
    $traffic = $array[3][2];soll Gesamttraffic anzeigen: 4.Zeile (Zählung beginnt mit 0, 2.Spalte
    $traffic = StringStripWS ( $traffic, 2 );entfernt Leerzeichen u.ä. am Anfang und Ende von $traffic (führt sonst zu Überspringen von if-Abfrage)
    ;_ArrayDisplay($array)
    EndIf
    _IEQuit($oIE); schließt IE

    [/autoit][autoit][/autoit][autoit]

    EndFunc

    [/autoit]

    2 Mal editiert, zuletzt von Poloshirt (28. Juli 2009 um 21:34)