Best Practices > Diskussionen zu Best Practices
Best Practices: Error Handling in Lotus Script: Einleitung
Glombi:
Ich habe mal folgendes ausprobiert:
ErrorHandling:
Dim cproc As Variant
Dim cmod As Variant
Dim cline As Variant
cproc = Getthreadinfo( LSI_THREAD_CALLPROC )
cmod = Getthreadinfo( LSI_THREAD_CALLMODULE )
cline = Getthreadinfo( LSI_THREAD_LINE )
cmod liefert mir aber leider nur wohl nur die Notes-interner ID des Modules, nicht den Namen des Moduls, in dem der Fehler auftrat.
cline liefert eine andere Zahl als Erl.
Ich kann mich dunkel erinnern, dass LSI_THREAD_CALLMODULE schon mal den Namen der Sub ausgegeben hat (evtl. liegt es an meiner Versio 5.0.9)
Andreas
Glombi:
Wenn man ein On Error... verwendet, sollte man sich ebenfalls überlegen, wo man das überall macht:
- in jeder Sub / Function ?
- nur in der Main Sub (Initialize, Click,...)
- Was ist bei Verwendung von Script Libraries, wenn dort ein Fehler auftritt?
Ich habe den Fall gehabt, dass ich in einer Sub das On Error goto ...hatte, das Script aber bei Auftreten eines Fehler die Sprungmarke aus der aufrufenden Sub, wo auch On Error goto... stand, verwendet hatte.
Wenn in einer Unterfunktion ein Fehler auftritt, so muß man das in der Hauptfunktion berücksichtigen! Man kann zwar in der Unterfunktion wunderbar eine Fehlermeldung ausgeben, in der Hauptfunktion geht es dann aber munter weiter...
Daher kann es sinnvoll sein, alle Unterfunktionen als Function zu definieren, die dann True oder False zurückgeben. Oder man verwendet ein Parameter (Call by reference), denn man dann auf True oder False setzt, und dann in der aufrufenden Sub abfragt.
animate:
Mir fällt gerade noch was ein: es kann auch sehr vorteilhaft sein, wenn man Fehler, die auftreten, loggt. Dazu bietet LS eine sehr schöne Klasse an: NotesLog.
Gleichzeitig habe ich noch eine Frage, die mich zur Zeit beschäftigt: Die für mich wichtigsten Informationen zu einem Fehler neben seinem Namen sind Zeilennummer und Funktionsname. Diese Infos stehen mir auch zur Verfügung(über Erl, GetThreadInfo), wenn das Script in einem Designelement (Form, Agent, ScriptLibrary, etc.) steht.
Was mache ich aber, wenn ich den Code in ASCII-Dateien auslagere und per %Include in die Designelemente einbinde? Dann bekomme ich als Zeilennummer die Zeile geliefert, in der das %Include-Statement steht und als Funktionsnamen den Namen der Funktion, in der das %Include-Statement steht.
Wie komme ich zu sinvollen Informationen?
Hat jemand schon etwas auf diesem Gebiet geforscht?
Glombi:
Es bietet sich an, neben den von Notes mitgelieferten Bordmitteln noch was eigenes zu machen.
Bspw. in jeder Function/Sub :
Sub NameDerSub
Dim MODULE_NAME as String
MODULE_NAME = NameDerSub
On Error Goto ErrHandler
... hier der Code
AfterError:
Print "Routine Demo beendet"
Exit Sub
ErrHandler:
Print MODLULE_NAME & ": Der Fehler mit Nummer " & Str(Err) & " mit der Meldung " & Error$ & " ist bei Zeile " & Str(Errl) & " aufgetreten. Wir steigen aus"
Resume AfterError:
End Sub
Semeaphoros:
Leider habe ich keine Notizen gemacht seinerzeit, wir hatten mal mit GetThreadInfo in der Error-Behandlung experimentiert, sind aber auch nicht wirklich glücklich geworden. Weder Erl noch GetThreadInfo lieferte uns zuverlässige Angaben über den Fehlerort, sobald irgendwelche Subroutinen oder Funktionen aufgerufen wurden. Mit Custom-Klassen haben wirs schon gar nicht probiert!
Ich selbst realisiere es schliesslich so, dass ich in jedem Modul eine eigene Fehlerbehandlung definiere und die Fehlerroutine, damit sie nicht immer neu geschrieben werden muss, als Subroutine ausgestalte, welche als einen der Parameter in der Regel den Namen des Moduls enthält. Damit bin ich aber auch plattform-unabhängig und bewege mich innerhalb des Standards (grade Errorhandling ist ja etwas, das man vielleicht auch mal in einem VBA brauchen kann :-)
Navigation
[0] Themen-Index
[#] Nächste Seite
[*] Vorherige Sete
Zur normalen Ansicht wechseln