Domino 9 und frühere Versionen > ND8: Entwicklung
On Error Goto läuft auch im Gut-Fall in Errorcase
buzi:
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:
Du hast ein "Exit Sub" vorm "ErrorCase" vergessen. :)
Tode:
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.
buzi:
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??
Tode:
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
--- Ende Code ---
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
--- Ende Code ---
Auf diese Weise ist das Log IMMER geschlossen, und es geht nix verloren...
Navigation
[0] Themen-Index
[#] Nächste Seite
Zur normalen Ansicht wechseln