Best Practices > Diskussionen zu Best Practices

Best Practices: Error Handling in Lotus Script: Einleitung

<< < (2/12) > >>

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