Wirklich alle Fehlermeldungen abfangen

  • VB6

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von VBMichi.

    Wirklich alle Fehlermeldungen abfangen

    Hallo,

    Ich habe den folgenden Code erstellt:

    Visual Basic-Quellcode

    1. Sub Main()
    2. 'variables
    3. Dim strSubject as string
    4. Dim strbody as string
    5. Dim strTo as string
    6. Dim strprompt as string
    7. Dim strfileloc as string
    8. Dim strfilename as string
    9. Dim Logfile as string
    10. 'objects
    11. Dim objImpApp As object
    12. Dim objImpRep As Object
    13. Dim objOutlookEmail As Object
    14. '
    15. on error goto errmes
    16. '
    17. strfileloc = "K:\xl\Schemes\"
    18. strprompt = Format(CStr(CVar(Date)-1),"dddd, d Mmmm")
    19. strfilename = strfileloc + "Schemes for " & strprompt & ".xls"
    20. Logfile = "C:\MacroLog.csv"
    21. '
    22. Open Logfile For APPEND As #1
    23. Write #1, Format(DATE,"yyyy-MM-dd"),Format(Time,"HH:mm:ss"), "Nefarious Schemes Start"
    24. Close #1
    25. '
    26. Set objImpApp = CreateObject("CognosImpromptu.Application")
    27. objImpApp.OpenCatalog "\\Acmefile01\cognos\catalogues\sql.cat","Creator",,,,1
    28. Set objImpRep = objImpApp.OpenReport ("\\Acmefile01\cognos\reports\World Domination Plans.imr")
    29. Set objImpRep = objImpApp.ActiveDocument
    30. objImpRep.ExportExcelWithFormat strfilename
    31. objImpRep.CloseReport
    32. objImpApp.Quit
    33. Set objImpApp = Nothing
    34. Set objImpRep = Nothing
    35. '
    36. endmac:
    37. Open Logfile For Append As #1
    38. Write #1, Format(DATE,"yyyy-MM-dd"),Format(Time,"HH:mm:ss"), "Nefarious Schemes End"
    39. Close #1
    40. Exit Sub
    41. '
    42. ErrMes:
    43. Open Logfile For Append As #1
    44. Write #1, Format(DATE,"yyyy-MM-dd"),Format(Time,"HH:mm:ss"), "Error " & Err & " @ line: " & Erl & " - " & Error$
    45. Close #1
    46. Resume endmac
    47. End Sub


    Er wird taeglich von einem Scheduler laufen gelassen und erfuellt kurz gesagt folgendes: Von einen Tool genannt Impropmptu wird ein bestimmter Datebankextrakt erzeugt und in einer xls Datei gespeichert. Des weiteren sollen alle auftretenden Fehler in einer csv Logdatei protokolliert werden (Mit fehlern ist hier gemient Fehler mit Datenbank Connect etc sowie Fehler beim Erstellen der xls Datei)

    Genau da liegt das Probelm
    Die Zeile on error goto ErrMess wird immer nur angestossen wenn es Problemem mit der Datenbank gab. Alle
    Fehler welche durch Fileoperationen entstehen (File kann nicht gespeichert werden, Ordner existiert nicht, Kein schreibzugriff etc) werden einfach nicht protokolliert.

    Kann mir jemand sagen was ich falsch mache, oder wo ich in meinem Code ansetzen muss dass auch diese Fehler protokolliert werden?

    Denke mal ich muss hier ansetzten ,denn diese Zeilen speichern den Extract in dem xls File,aber ich weiss einfach nicht wie: Set objImpRep = objImpApp.ActiveDocument
    objImpRep.ExportExcelWithFormat strfilename
    objImpRep.CloseReport

    Wass ich also will ist wenn fehler beim speichern, dann auch diesen Fehler protokollieren.

    Vielen Dank im Voraus fuer Tipps

    Edit by Agent: VB-Tag hinzugefügt

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

    Ich schätze mal, du musst den letzten Fehler mit "Err.Clear" zurücksetzen, damit On Error Goto beim nächsten Fehler wieder funktioniert.
    Gruß, Agent Smith 8-)

    activeFlags = (lazy OR weary)

    Lemgo-Verschwörung | Mathematics | VB-Paradise in blau
    Hallo,

    ich bin in VB leider Anfaenger. Hab bisher mit php und perl zu tun gehabt.

    Wann genau springt denn on err goto errmss an? Bei jedem nur möglichen Fehler?

    Dass Problem ist nämlich wenn ich versuche einen Fehler zu provozieren (der Ordner in dem die xls Datei gespeichert wird hat keine schreibrechte) dann wird die xls Datei logischer Weise nicht produziert, da keine schreibrechte, aber das ganze muesste doch einen Fehler produzieren.

    Gucke ich aber in mein Logfile dann steht da die Startzeit und Endzeit. Also das Macro ist gelaufen, aber eine Errormessage wurde keine eingetragen.

    Also das mit dem zuruecksetzten verstehe ich nicht. Der einzige Fehler der auftritt ist das nicht in den Ordner geschrieben kann. Und genau den will ich dann im Logfile protokollieren.

    Kann mir dabei jemand helfen?

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „galaxy“ ()

    Wann genau springt denn on err goto errmss an? Bei jedem nur möglichen Fehler?

    Sobald irgend ein Laufzeitfehler auftritt: msdn: On Error-Anweisung

    der Ordner in dem die xls Datei gespeichert wird hat keine schreibrechte

    Hast du schon mal das "On Error" und alle anderen unwichtigen Sachen auskommentiert, ob er dort überhaupt rein geht und ein Laufzeitfehler erzeugt? Evtl sind schreibgeschützte Dateien für VB kein Laufzeitfehler und ignoriert diese stillschweigend, dies solltest du aber durch step-by-step debuggen herausfinden.
    Gruß, Agent Smith 8-)

    activeFlags = (lazy OR weary)

    Lemgo-Verschwörung | Mathematics | VB-Paradise in blau

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

    Was genau meinst du mit

    "Hast du schon mal das "On Error" und alle anderen unwichtigen Sachen auskommentiert, ob er dort überhaupt rein geht und ein Laufzeitfehler erzeugt?"

    Er geht immer in das on error rein sobald ein Datenbankfehler auftritt. Nur bei fileoperationen wird nichts protokolliert. wenn ich doch on error auskommentiere dann sehe ich doch gar nicht mehr ob er fehlermeldungen protokolliert!

    Da sind praktisch nur die wichtigsten sachen drin. Report in Impromptu laufen lassen und loggen der Errors. Mehr soll das Macro nicht machen
    Hi galaxy,

    ich denke, dass Du in Zeile 47 nicht "Resume endmac" sondern "Resume Next" einfügen musst, da in Deinem Fall die Sub ja nach der ersten Fehlerauslösung verlassen wird. Duch die Resume Next-Anweisung erreichst Du, dass es an der Stelle weiter geht (dahinter!), an der der letzte Fehler ausgelöst wurde und somit auch alle weiteren Fehler protokolliert werden. Darüber hinaus setzt die Resume Next-Anweisung innerhalb einer Fehlerbehandlungsroutine auch das Err-Objekt wieder zurück, so dass Err.Clear dann nicht mehr nötig ist.

    In Deinem Beispiel wird dann (mit der Resume Next-Anweisung) der Fehler 429 und danach 6x der Fehler 91 protokolliert, aber das ist verständlich, da Du ja tatsächlich 6x hintereinander den gleichen Fehler auslöst.

    Nicht ganz klar ist mir, wo die in Zeile 45 auftretende Variable "Erl" herkommt - die Zeilennummer in der der Fehler auftritt ist es jedenfalls nicht, sie ist immer =0!?

    Des Weiteren gib mal vor Zeile 27 den folgenden Code ein, und Du wirst sehen, dass in Deinem Protokoll auch die Fehlermeldung #53 (Datei nicht gefunden) auftaucht.

    Visual Basic-Quellcode

    1. Open "Unsinn" For Input As #1
    2. Close #1


    Ich hoffe, dass ich Deine Frage(n) richtig verstanden habe und jetzt alles klappt.

    mfG
    mfG DHB

    Ich meine:
    :P Es sollten nur ernstzunehmende Beiträge eingestellt werden!
    :( Beiträge, die nur deren Anzahl in die Höhe treiben sollen, stehlen Lesern deren Zeit und schenken nur Frust.
    ;) Wenn ein Autor sein Thema für erledigt hält, sollte er dies kurz als letzten Eintrag vermerken.
    8) Leser wüssten dann, dass hier weitere Beiträge nicht mehr sinnvoll sind.
    Hallo,

    Das mit dem "hoffe, dass ich Deine Frage(n) richtig verstanden habe und jetzt alles klappt" ist leider nicht so.

    Ich will nicht mehrere hintereinander auftretende Fehlermeldungen abfangen.

    Einen Datenbankfehler habe ich schon produziert. Dieserwird auch einwandfrei in der Log Datei gespeichert.

    Wenn ich nun 100 % alle andren Fehler ausschliessen kann, und nur einen Fileoperation Fehler provoziere (z.B in einen Ordener schreiben der nur "readonly" ist) dann wird nichts in der csv-Logdtei geloggt. An dem ModifyDatum der Report.xls Datei kann ich aber sehen das nichts passiert ist. Also kein update der Datei. Somit muss doch ein Fehler vorliegen (keine Schreibrechte). Genau diesen moechte ich protokollieren.

    Da ich aber VB Anfaenger bin tue ich mich ziemlich schwer damit.

    Ich denke das es mit der Funktion objImpRep.ExportExcelWithFormat strfilename zu tun hat. Leider weiss ich nicht mal ob das eine generelle Excel Funktion ist oder ob sie Impromptu spezifisch ist.

    Kann man nicht irgendwie sowas schreiben (hier nur Pseudocode):

    if (objImpRep.ExportExcelWithFormat strfilename) != true
    then
    write in csv file "Error beim erstellen der xls Datei"
    Dabei haette ich dann aber alle Fhlermeldungen ueber einen Kamm geschaert.

    Besser waere natuerlich wenn ich eine genauere Fehlermeldung haette.

    Kann mir jemand dabei helfen?

    @DHB
    Das mit den beiden Codezeilen

    Open "Unsinn" For Input As #1
    Close #1

    erzeugt un loggt eine Fehlermeldung in dem csv File. Genau das will ich auch bei der Funktion objImpRep.ExportExcelWithFormat strfilename
    aber es funktioniert nicht
    Hi galaxy. Versuch doch mal das hier:

    Quellcode

    1. ErrMes:
    2. Open Logfile For Append As #1
    3. Write #1, Format(Date,"yyyy-MM-dd"),Format(Time,"HH:mm:ss"), "Error " & Err & " @ line: " & Erl & " - " & Error$
    4. Close #1
    5. On Error GoTo -1
    6. Resume endmac


    Funktioniert möglicherweiße.

    Grüße