Fehlerabfrage bei COM Objekten

  • Hallo,

    Lese Daten aus einer CSV-Datei aus und möchte diese in einer Access-DB speichern.
    Funktioniert auch grundsätzlich.
    Dabei kann es aber vorkommen, dass ein Datensatz nicht gespeichert werden kann, weil schon vorhanden (doppelter Datensatz nicht erlaubt).
    Also Fehlerbehandlung für COM Objekte eingefügt.

    [autoit]


    Global $oMyError = ObjEvent("AutoIt.Error","MyErrFunc")

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

    ...

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

    Func MyErrFunc($oMyError)
    Local $HexNumber
    Local $strMsg

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

    $HexNumber = Hex($oMyError.Number, 8)
    $strMsg = "Error Number: " & $HexNumber & @CRLF
    $strMsg &= "Error Description: " & $oMyError.description & @CRLF
    $strMsg &= "Script Line: " & $oMyError.ScriptLine & @CRLF
    MsgBox(0, "ERROR", $strMsg)
    Endfunc

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

    Wie kann ich den Fehler abfangen, damit ich ihn für ein Log wegschreiben kann (Number und Description)?
    Ziel ist, das Skript durchlaufen zu lassen, ohne dass dieser Fehler einen Abbruch macht.
    Zudem habe ich festgestellt, dass die Fehlerfunktion zweimal gerufen wird, einmal beim Recordset.Update und dann beim Recordset.Close.
    Die Infos, die ich brauche stehen im Recordset.Update. Wie kann ich den Fehler bei Recordset.Close ignorieren?

    Vielen Dank im Voraus.

    Einmal editiert, zuletzt von Don (30. Dezember 2013 um 11:46)

  • Hallo,
    Wie kann ich den Fehler abfangen, damit ich ihn für ein Log wegschreiben kann (Number und Description)?

    Öhm in dem du die msgbox in deiner Error Funktion einfach durch ein filewrite oder vergleichbares ersetzt (z.B. speichern aller Fehler in einem globalen Array und schreiben des Arrays in eine Logdatei bei Programmende)?

    Zum Ausfiltern der für dich uninteressanten Fehlermeldung müsstest du die Fehler vergleichen und schaun ob dort irgendwo vermerkt ist welcher Aufruf sie verursacht hat. Ich nehme mal an das hast du bereits getan, andernfalls wüsstest du nicht, dass die Meldung von beiden Aufrufen ausgelöst wird. Eine Möglichkeit wäre z.B. eine if...then...else Bedingung in deiner Error Funktion anhand der "scriptline", allerdings wäre das extrem unzuverlässig und müsste bei jeder Code Änderung angepasst werden. Eventuell unterscheiden sich beide Fehler auch in der "description" oder in der "number". Das müsstest du aber selbst prüfen oder die beiden Fehlermeldungen hier posten...

    EDIT:

    Hier im übrigen noch einige weitere Eigenschaften die du abfragen könntest um beide Fehler besser zu unterscheiden:

    Zitat


    Eigenschaften des AutoIt-Error-Objekts:

    Code
    .number 	Der Windows-HRESULT-Wert eines COM-Aufrufes
    .windescription Der FormatWinError()-Text, der von .number abgeleitet wurde
    .source 	Name des Objekts, das den Fehler erzeugt hat (Inhalt von ExcepInfo.source)
    .description 	Fehlerbeschreibung des Quellobjekts (Inhalt von ExcepInfo.description)
    .helpfile 	Fehler-Hilfedatei des Quellobjekts (Inhalt von ExcepInfo.helpfile)
    .helpcontext 	Hilfedatei-Kontext-ID des Quellobjekts (Inhalt von ExcepInfo.helpcontext)
    .lastdllerror 	Die von GetLastError() gelieferte Nummer
    .scriptline 	Die Skriptzeile, in der der Fehler generiert wurde

    Einmal editiert, zuletzt von misterspeed (27. Dezember 2013 um 17:51)

  • Danke für den Vorschlag.

    Ich habe nun versucht in der Fehlerfunktion MyErrFunc über SetError(1) den Fehlercode @error auf 1 zu setzen und diesen im normalen Coding abzufangen.
    Das funktioniert aber leider nicht.
    Im Debugger hat @error innerhalb von MyErrFunc noch den Wert 1, aber im Hauptprogramm dann -214...
    Was muss ich beachten?

  • Ich kann dir zwar nicht mit Sicherheit sagen warum das so ist, aber ich denke mal die Funktion MyErrFunc() wird mehr oder weniger "zwischendrin" ausgeführt und danach der fehlerhafte COM Aufruf beendet. Da es zum Fehler kam wird @error scheinbar dann beim Abschließen der COM Aktion verändert.

    Einfachste Lösung: Verwende statt @error eine globale Variable die du im Code überprüfst bzw. in deiner Funktion MyErrFunc() veränderst.