Autor Thema: On Error Goto läuft auch im Gut-Fall in Errorcase  (Gelesen 3420 mal)

Offline buzi

  • Aktives Mitglied
  • ***
  • Beiträge: 171
Ich hab ein Problem dass ich nicht verstehe. Sorry, komme aus der OO-Welt und Lotus Script ist für mich zwar machbar aber nicht immer besonders verständlich.

Wenn ich am Anfang einer Sub das On Error GoTo ERRORCASE schreibe, läuft mein Code immer am Ende in den ERRORCASE auch wenn es gar keinen Fehler unterwegs gab!!! Was mache ich da falsch?

Danke fürs Mitdenken...

Sub Initialize
   On Error GoTo ErrorCase
         
   Set ns = New NotesSession
   Set db = ns.Currentdatabase
   
   Dim profileDoc As NotesDocument
   Set profileDoc = db.GetProfileDocument("frmProfil")

   .......
      
Errorcase:
   Messagebox "ERROR FOUND: " & CStr(Err)
        Exit Sub
      
End Sub

Mitch

  • Gast
Re: On Error Goto läuft auch im Gut-Fall in Errorcase
« Antwort #1 am: 13.05.15 - 10:22:50 »
Du hast ein "Exit Sub" vorm "ErrorCase" vergessen. :)


Offline Tode

  • Moderatoren
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 6.883
  • Geschlecht: Männlich
  • Geht nicht, gibt's (fast) nicht... *g*
Re: On Error Goto läuft auch im Gut-Fall in Errorcase
« Antwort #2 am: 13.05.15 - 10:45:12 »
Kurz zur Erklärung: Sprungmarken (definiert mit einem Doppelpunkt) werden beim "normalen" Durchlaufen des Codes einfach ignoriert.
Dein Code kommt also an ganz normal am Ende des Codes an die Sprungmarke und läuft darüber hinweg.

Ein Exit Sub vor Errorcase: verhindert das.
Gruss
Torsten (Tode)

P.S.: Da mein Nickname immer mal wieder für Verwirrung sorgt: Tode hat NICHTS mit Tod zu tun. So klingt es einfach, wenn ein 2- Jähriger versucht "Torsten" zu sagen... das klingt dann so: "Tooode" (langes O, das r, s und n werden verschluckt, das t wird zum badischen d)

Offline buzi

  • Aktives Mitglied
  • ***
  • Beiträge: 171
Re: On Error Goto läuft auch im Gut-Fall in Errorcase
« Antwort #3 am: 20.05.15 - 09:17:17 »
Das heißt Errorcase Sprungmarken setzt man am besten nach einer Funktion oder Sub-Routine? Und im Fehlerfall wird dies dann abgearbeitet? Wundert mich nur, weil die Beispielroutinen im Errorhandling Kapitel des LotusScript Entwicklerhandbuch den Errorcase immer in den Routinen hat. Ihr sagt, dass sie innerhalb der Routinen auch immer mit ausgeführt werden? Und wenn ich vorher das End Sub schreibe, also der Errorcase außerhalb der Sub liegt kriege ich schon im Pre-Compiler ein rotes Kreuz und die Meldung "Label is illegal outside of a subprogram"..... ???

Ich habe es jetz so gelöst:


Sub Initialize
   On Error GoTo ErrorCase
         
   Set ns = New NotesSession
   Set db = ns.Currentdatabase
   
   Dim profileDoc As NotesDocument
   Set profileDoc = db.GetProfileDocument("frmProfil")

   .......
Errorcase:
   If Err <> 0 Then
      Call clLog.Logerror(2, " ERROR FOUND?: " & Err & ", " & Error$)
   End If
   Call clLog.close()
   Exit Sub
   
End Sub

-> Ist das best practise oder unschön??
« Letzte Änderung: 20.05.15 - 09:22:54 von buzi »

Offline Tode

  • Moderatoren
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 6.883
  • Geschlecht: Männlich
  • Geht nicht, gibt's (fast) nicht... *g*
Re: On Error Goto läuft auch im Gut-Fall in Errorcase
« Antwort #4 am: 20.05.15 - 09:23:53 »
Nein, das geht nicht (also das mit dem Ausserhalb). Ein "korrektes" ErrorHandling sieht so aus (für eine Sub):
Code
EndSub:
  Exit Sub
Errorcase:
  Messagebox "ERROR FOUND: " & CStr(Err)
  Resume EndSub
End Sub

Auf diese Weise läuft der Code NICHT in die ErrorRoutine, wenn er auf "normalem" Weg das "Exit Sub" vor dem ErrorHandler erreicht.

Das Resume ist immer dann wichtig, wenn Du den Fehler "löschen" willst, ihn also nicht an eine ggf. aufrufende Funktion "weitergeben" willst.
Ohne Resume würde die aufrufende Sub / Function selbst wieder in ihren eigenen ErrorHandler laufen, was manchmal das ist, was man will, manchmal aber auch nicht, ist also immer Geschmacksache / bzw. Kontextabhängig, ob da als letzte Zeile "Resume EndSub" oder "Exit Sub" steht.

EDIT: Wenn man sowas wie ein Log hat, dann schliesst man das typischerweise nach dem "EndSub"- Label, also so:

Code
EndSub:
  If not oLog is Nothing then
    call oLog.Close()
  End If
  Exit Sub
Errorcase:
  Call clLog.Logerror(2, " ERROR FOUND?: " & Err & ", " & Error$)
  Resume EndSub
End Sub

Auf diese Weise ist das Log IMMER geschlossen, und es geht nix verloren...
« Letzte Änderung: 20.05.15 - 09:28:16 von Tode »
Gruss
Torsten (Tode)

P.S.: Da mein Nickname immer mal wieder für Verwirrung sorgt: Tode hat NICHTS mit Tod zu tun. So klingt es einfach, wenn ein 2- Jähriger versucht "Torsten" zu sagen... das klingt dann so: "Tooode" (langes O, das r, s und n werden verschluckt, das t wird zum badischen d)

Mitch

  • Gast
Re: On Error Goto läuft auch im Gut-Fall in Errorcase
« Antwort #5 am: 20.05.15 - 09:38:49 »
Das Skript läuft grundsätzlich von "Sub XYZ" bis "End Sub". Außer es stößt auf ein "Exit Sub" oder nicht abgefangene Fehler.

Sprungmarken sind eben nur Sprungmarken. Sprich: Das Programm springt zu dieser Marke. Danach läuft es natürlich weiter, warum sollte es auch nicht? "ErrorCase" ist ja auch kein reservierter Bezeichner für eine Fehlersprungmarke, du könntest ja genauso "On Error Goto Kekseessen" schreiben und eine entsprechende Marke erstellen. Und weitere, zusätzliche Sprungmarken für andere Zwecke verwenden, auch wenn das eher selten vorkommt (bzw. vorkommen sollte, da unübersichtlich).

Code
Sub XYZ
   On Error Goto Kekseessen

    '... Code

   Exit Sub
Kekseessen:
    '... Fehlerbehandlung
     Exit Sub
End Sub

So sieht quasi ein Try-Catch-Block in Notes aus. Vielleicht nicht schön aus OO-Sicht, aber funktioniert. Ob man nach der Fehlerverarbeitung nun mit "Exit Sub" beendet, mit "Resume Next" einfach in der Zeile nach dem Fehler weitermacht oder, wie Tode schrieb, an einer anderen Sprungmarke "resumed" ist, ja, eben Geschmackssache bzw. kontextabhängig.

Gruß,

Mitch

Offline Tode

  • Moderatoren
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 6.883
  • Geschlecht: Männlich
  • Geht nicht, gibt's (fast) nicht... *g*
Re: On Error Goto läuft auch im Gut-Fall in Errorcase
« Antwort #6 am: 20.05.15 - 09:54:24 »
Nur um nochmal Mitchs Aussage von wegen "zusätzlicher Sprungmarken" aufzunehmen: Das kann durchaus in komplexerem Code vorkommen.

So kann man sich vorstellen, dass man einen bestimmten Fehler "erwartet", den man aber beheben kann.

Ein Beispiel: NotesDatabase.GetDocumentByUnid( "irgendeineUnid" ) wirft den Fehler 4091, wenn die UNID nicht existiert. Da könnte ein Code so aussehen (in dem Fall wird einfach ein neues Dokument erstellt, weil das "gesuchte" ja nicht da ist...):

Code
Sub MySub()
  On Error Goto ErrorHandler
  On Error 4091 Goto ErrorInvalidDocument

...
  Set doc = db.GetDocumentByUnid( strEineUnid )
  Call doc.ReplaceItemValue( ... )

EndSub:
  Exit sub
ErrorInvalidDocument:
  Set doc = New NotesDocument( db ) 
  Resume Next '- macht bei der Anweisung direkt NACH der weiter, die den Fehler geworfen hat, in dem Fall die Call doc.ReplaceItemValue( ... )
Errorhandler:
   Messagebox "ERROR FOUND: " & CStr(Err)
        Resume EndSub
End Sub
Gruss
Torsten (Tode)

P.S.: Da mein Nickname immer mal wieder für Verwirrung sorgt: Tode hat NICHTS mit Tod zu tun. So klingt es einfach, wenn ein 2- Jähriger versucht "Torsten" zu sagen... das klingt dann so: "Tooode" (langes O, das r, s und n werden verschluckt, das t wird zum badischen d)

Mitch

  • Gast
Re: On Error Goto läuft auch im Gut-Fall in Errorcase
« Antwort #7 am: 20.05.15 - 10:27:48 »
@Tode:

Ja, das wäre ein Einsatzgebiet. Wobei ich persönlich in dem Beispiel auch nur mit einer einzigen Error-Sprungmarke arbeiten würde und dann lieber mit If-Else bzw. Select-Case spezielle Fehler abfangen würde.

Mir fällt zur Zeit nur eine Sort-Methode ein, in der ich eine nicht-fehlerbezogene Sprungmarke verwende. Und vermutlich wäre auch die umgehbar.

Aber es wird sicherlich so einige sinnvolle Einsatzmöglichkeiten für Sprungmarken geben, ich hatte bloß mal Code in der Hand gehabt in dem statt Selects und For/Whiles ganz viele Sprungmarken verwendet wurden. Das war ein ebenso chaotisches wie prägendes Erlebnis und seitdem mag ich die Dinger nicht. ;)

Gruß,

Mitch

Offline Axel

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 8.658
  • Geschlecht: Männlich
  • It's not a bug, it's Notes
Re: On Error Goto läuft auch im Gut-Fall in Errorcase
« Antwort #8 am: 20.05.15 - 11:11:42 »
@buzi

Schau mal hier:  http://atnotes.de/index.php/topic,11980.0.html

Da findest du eine gute Erklärung zum Errorhandling in Lotus Script.

Axel
Ohne Computer wären wir noch lange nicht hinterm Mond!

Offline Tode

  • Moderatoren
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 6.883
  • Geschlecht: Männlich
  • Geht nicht, gibt's (fast) nicht... *g*
Re: On Error Goto läuft auch im Gut-Fall in Errorcase
« Antwort #9 am: 20.05.15 - 11:13:29 »
Noch ein Beispiel: man durchläuft in einem längeren Code eine große DocumentCollection, und möchte einfach mit dem nächsten Dokument weitermachen, wenn irgendein Fehler (Dokument nicht lesbar, Felder nicht vorhanden, Dokument invalide, und vieles was man vorher nicht bedacht hat) auftritt. Dann packe ich um die "Verarbeitung" des Dokuments ein "On Error Goto ErrorInSchleife" und dort dann ein "Schreibe Log, Resume NextDoc", während der Rest des Codes einfach mit dem "normalen" ErrorHandler versorgt wird...

Ich stimme Dir zu: Für das Beispiel, in dem ich den Fehler KENNE, der auftreten wird, arbeite ich normalerweise auch mit einer einzelnen Sprungmarke und einem IF.
Gruss
Torsten (Tode)

P.S.: Da mein Nickname immer mal wieder für Verwirrung sorgt: Tode hat NICHTS mit Tod zu tun. So klingt es einfach, wenn ein 2- Jähriger versucht "Torsten" zu sagen... das klingt dann so: "Tooode" (langes O, das r, s und n werden verschluckt, das t wird zum badischen d)

Offline buzi

  • Aktives Mitglied
  • ***
  • Beiträge: 171
Re: On Error Goto läuft auch im Gut-Fall in Errorcase
« Antwort #10 am: 20.05.15 - 12:11:28 »
Danke für eure ausführlichen Hilfen zu dem Thema. Jetz hab auch ich es kapiert. Vom objektorientierten Umfeld auf Notes Script umzusteigen kostet mich doch mehr Nerven als gedacht. Gut dass es hier so viele nette hilfsbereite Notes Anhänger gibt!!

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz