Nein, das geht nicht (also das mit dem Ausserhalb). Ein "korrektes" ErrorHandling sieht so aus (für eine Sub):
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:
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...
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).
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
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...):
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