Frage zu "On Error Goto:"

  • Hallo zusammen,


    ich möchte beim Speichern eines Dokuments ggf. auch daten in einem anderen bestehenden Dokument ändern. Probleme macht mir das nur wenn das zweite Dokument (einer anderen Datenbank) gelöscht wurde. Das hab über ein On Error gelöst:


    Code
    On Error Goto TerminDeletedSet doc = dbmail.GetDocumentByUNID(UID)...TerminDeleted:...


    Das ganze klappt auch wunderbar, nur hab ich das selbe ein paar Zeilen weiter nochmal

    Code
    On Error Goto ETerminDeleted
    Set doc = dbmail.GetDocumentByUNID(UID)
    ...
    ETerminDeleted:
    ...


    Wurde nur der Termin gelöscht funktioniert das skript.
    Wurde nur der ETermin gelöscht funktionert das skript auch.
    Wurden aber beide gelöscht funktionierts nicht mehr. (der zweite teil liefert eine "Invalid Universal ID".


    Warum kann ich nur ein ON ERROR GOTO machen? Was mach ich falsch?
    Kann ich das irgendwie anders abfangen??? (goto's sind ja nicht so elegant, weiß mir aber nicht anders zu helfen)


    in C++ kenn ich das hald so:
    try { ...} catch(...) {}
    aber sowas gibts hier ja leider nicht... ;(


    Irgendwelche Ideen???


    Danke soweit!!!

  • So wie ich das sehe brauchst Du hier kein on Error goto.


    Du willst doch wissen, ob das folgende Dok existiert oder nicht?
    >> Set doc = dbmail.GetDocumentByUNID(UID)


    Da würde also ein


    If Not doc Is Nothing Then
    --- mache was
    End If


    reichen.

  • So einfach ist es leider nicht.


    Wenn die übergebene UNID ungültig oder nicht vorhanden ist wirft die Funktion GetDocumentByUNID schon einen Fehler, also kommt das Script nie zu der Überprüfung

  • Zitat

    Grundsätzlich:
    "On Error Goto A" hält immer so lange, bis ein "On Error Goto B" folgt. "On Error Goto B" hebt also "On Error Goto A" auf, wenn dieses nach "On Error Goto A" im Code folgt.


    Und genau das ist eben nicht so ;(


    Hier die Source:

  • Hi,


    ich habe 2 Lösungsansätze für Dich:


    1. statt "On Error Goto Irgendwohin" kannst Du auch "on Error Goto Next" nehmen. Dann sollte auch das bereit erwähnte "if not(doc is nothing) ..." funktionieren.


    2. bau Dir eine Ansicht, die alle Deinen gewünschten Dokumente enthält und nach der DOK-ID sortiert ist. Mach dort ein dblookup drauf und schau nach, ob Dein Dok noch/schon dabei ist ...

    Für jedes Problem gibt es eine einfache Lösung, die es noch schlimmer macht.

  • Deine vorgehensweise ist übrigens sehr gefährlich, den ELSE direkt zu verwenden für den On Error... dieses on error statement schiebt nämlich daten auf den stack der nur mittels resume wieder verwertet werden, welches in dein fall bedeutet das den stack nie befreit wird, und damit dein system in einen zustand kommt der er erst beim beenden des script wieder aufräumen kann... unter umständen kann diese art der programmierung (hier glücklicherweise nicht weil begrenzte dokument zahl) in ersthafte problemen kommen, RBOD nicht ausgeschlossen.
    Eine On Error sollte in einem eigenen abschnitt verfolgt werden, und mittels Resume Label oder Resume next wieder im programm zurück kommen... den vorgehensweise ist vorgelegt, und sollte iengehalten werden, nicht von mir sondern vom programmiersprache her.

  • Grosses Dankeschön an alle, konnte das problem lösen.


    Für interessierte hier nun die komplette Source:


  • on error goto next verwende ich wirklich nur in ausnahme fällen und nur für kurze Codesegmente, da dadurch unerwünschte nebeneffekte auftreten können. Wenn z. B. ein Datenbank Objekt nicht initialisiert werden konnte, werden alle Operationen mit diesem Objekt zu einem Fehler führen und er läuft jedesmal in die Fehler-Routine.


    Ich verwende meistens folgende Syntax:


    sub XY
    on error goto Fehler
    ..... code ....


    if err <> 0 then
    print Err$ 'or something else
    end if
    sub end

  • Hi MPerio,
    danke für den hinweis, gefällt mir auch besser so:


    Code
    Function GetDocByID (ID As String, dbmail As NotesDatabase) As NotesDocument	On Error Resume Next	Set GetDocbyID = dbmail.GetDocumentByUNID(ID)	End Function