Best Practices > Diskussionen zu Best Practices
Best Practices: Error Handling in Lotus Script: Einleitung
Semeaphoros:
Da wir ja jetzt mit On Error die Fehlermeldungen unterdrücken können, müssen wir in unserer Fehlerbehandlungsroutine feststellen können, was denn nun passiert ist. Dafür stehen uns 3 Funktionen zur Verfügung:
Err gibt uns die Fehlernummer an.
Errl gibt uns die Zeilennummer des Fehlers an (Achtung, funktioniert nur richtig, wenn der Fehler nicht in einer aufgerufenen selbst definierten Funktion oder Subroutine auftritt)
Error$ gibt uns den Text der Standard-Fehlermeldung an.
Beispiel:
--- Code: ---Sub Demo
On Error Goto ErrHandler
... hier der Code
AfterError:
Print "Routine Demo beendet"
Exit Sub
ErrHandler:
Print "Der Fehler mit Nummer " & Str(Err) & " mit der Meldung " & Error$ & " ist bei Zeile " & Str(Errl) & " aufgetreten. Wir steigen aus"
Resume AfterError:
End Sub
--- Ende Code ---
Semeaphoros:
Da gibt es jetzt zu allem noch die Möglichkeit, dass wir als Trittbrettfahrer auf das System aufspringen können: Mit dem Error-Statement können wir selber eigene Fehlernummern und Fehlermeldungen generieren:
Error 100
löst die Fehlerbehandlung mit Nummer 100 aus
Error 101,"Dies ist unser eigener Fehler"
macht dasselbe, erzeugt aber zusätzlich noch den Fehlertext "Dies ist unser eigener Fehler"
Mit Hilfe des Error-Statements lassen sich an beliebiger Stelle im Programm entweder eigene Fehler "produzieren" oder alle LotusScript Fehler simulieren (praktisch, wenn man nicht das richtige Umfeld zur Verfügung hat).
Beispiel:
--- Code: ---Public x As Single
Const TOO_SMALL = 1001, TOO_BIG = 1002
Sub GetNum
Dim Num As String
On Error GoTo Errhandle
Num$= InputBox$("Enter a value between 1 and 100:")
x! = CSng(Num$) ' Convert the string to a 4-byte single.
' Check the validity of the entry.
If x! < 1 Then
Error TOO_SMALL, "The number is too small or negative."
ElseIf x! > 100 Then
Error TOO_BIG, "The number is too big."
End If
' If the script gets here, the user made a valid entry.
MessageBox "Good job! " & Num$ & " is a valid entry."
Exit Sub
' The user did not make a valid entry.
' Display the error number and error message.
Errhandle:
' Use the Err function to return the error number and
' the Error$ function to return the error message.
MessageBox "Error" & Str(Err) & ": " & Error$
Exit Sub
End Sub
--- Ende Code ---
Semeaphoros:
Ich habe glaube ich ziemlich vollständig abgedeckt, was an Theorie zur Fehlerbehandlung gehört. Garantieren tue ich das natürlcih nicht ;D da aber andere Leute schon ihre zusätzlichen Beiträge versprochen haben, werden allfällige Lücken sicher rasch gefüllt.
Es gibt verschiedene Taktiken, mit den oben aufgeführten Mitteln funktionierende Fehlerbehandlungen zu erstellen. Jeder hat da gewisse Vorlieben. Gerne würde ich jetzt von Euch Beispiele sehen, wie Ihr das macht und wir können dann gemeinsam Vor- und Nachteile der einzelnen Taktiken diskutieren. Das wird bestimmt sehr spannend.
Jens
animate:
Ich habe einen Tipp hinzuzufügen:
mit der LS-Funktion GetThreadInfo kann man sich Informationen besorgen, die man sehr gut in einem Errorhandler gebrauchen kann (z. B. den Namen der Funktion in der der Fehler auftritt oder gleich den ganzen call stack)
Bei dem Beispiel
--- Zitat ---Sub Demo
On Error 11 goto DivByZero
Resultat = Var1 / 0
On Error Goto 0
Exit Sub
--- Ende Zitat ---
würde ich mit gutem Beispiel voran gehen und anstelle der 11 die entsprechende Konstante ErrDivisionByZero (definiert in lserr.lss) verwenden, also
--- Zitat ---Sub Demo
On Error ErrDivisionByZero goto DivByZero
Resultat = Var1 / 0
On Error Goto 0
Exit Sub
--- Ende Zitat ---
(ein persönlicher Kampf gegen nichtssagende Zahlenkonstanten)
Semeaphoros:
Danke
Diese Funktion ist wirklich sehr hilfreich, nicht nur beim ErrorHandling, im Gegensatz zu den obigen Statements, die alle dem ANSI-Standard folgen, ist GetThreadInfo nur LotusScript und darüber hinaus auch noch Plattformabhängig (besonders wichtig bei Script, welches auf dem Server läuft).
Auch der Hinweis auf die Konstanten ist richtig, das steht eigentlich gerade unterhalb des Beispiels, das Du zitierst, Dein Beispiel wäre dort oben wirklich hilfreich gewesen :-)
Hier noch der Auszug aus der Hilfe zu GetThreadInfo:
Returns system information about the thread.
Syntax
GetThreadInfo (Dim InfoID as Integer)
Elements
InfoID
Information to be returned
Return values
Data
A variant containing the information to be returned.
Usage
Pass any of the LSI_ constants from the table below to GetThreadInfo to have it return the current value of that constant.
LSI_THREAD_LINE Current Line Number
LSI_THREAD_PROC Name of current procedure
LSI_THREAD_MODULE Name of current module
LSI_THREAD_VERSION LotusScript version number
LSI_THREAD_LANGUAGE (Human) language setting
LSI_THREAD_COUNTRY Country or region setting
LSI_THREAD_TICKS Get current clock ticks
LSI_THREAD_TICKS_PER_SEC Get clock ticks per second (supported only on platforms that support parallel processing primitives)
LSI_THREAD_PROCESS_ID Get current process ID (supported only on platforms that support parallel processing primitives)
LSI_THREAD_TASK_ID Get current task ID (supported only on platforms that support parallel processing primitives)
LSI_THREAD_CALLPROC Get the name of the calling procedure
LSI_THREAD_CALLMOD Get the name of the calling module
The values of the constants are defined in LSPRVAL.LSS, which is automatically included through LSCONST.LSS.
Navigation
[0] Themen-Index
[#] Nächste Seite
[*] Vorherige Sete
Zur normalen Ansicht wechseln