Domino 9 und frühere Versionen > ND8: Entwicklung
On Error Goto läuft auch im Gut-Fall in Errorcase
Mitch:
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
--- Ende Code ---
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
Tode:
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
--- Ende Code ---
Mitch:
@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
Axel:
@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
Tode:
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.
Navigation
[0] Themen-Index
[#] Nächste Seite
[*] Vorherige Sete
Zur normalen Ansicht wechseln