Best Practices > Diskussionen zu Best Practices
Best Practices: Error Handling in Lotus Script: Einleitung
TMC:
Ich habe mir jetzt mal eine eigene Display-Error - Sub erstellt, die ich Euch nicht vorenthalten will.
Insbesondere hat mich Getthreadinfo interessiert.
Wie Andreas schon angemerkt hat, weicht LSI_THREAD_LINE ab von der tatsächlichen Zeilennummer des Fehlers. Ich habe festgestellt, dass Leerzeilen nicht mitgezählt werden.
Da wir aber in Script eh "Erl" zur Verfügung haben, brauche ich das auch nicht.
--- Code: ---Sub DisplayError
Dim strTitle As String
Dim strMsg As String
Dim vProcedure As Variant
vProcedure = Getthreadinfo( LSI_THREAD_CALLPROC )
strTitle = "An error occured"
strMsg = _
"Error: " & Err & " - " & Error$ & Chr(10) & Chr(10)_
& "Procedure: " & vProcedure & Chr(10) & Chr(10) _
& "Line: " & Erl & Chr(10)
Msgbox strMsg , 48, strTitle
End Sub
--- Ende Code ---
Gedacht ist die Sub für die ScriptLibrary.
Wichtig: in die Options der ScriptLib muss die Zeile
--- Code: ---%INCLUDE "lsconst.lss"
--- Ende Code ---
, damit Getthreadinfo funktioniert.
So funktioniert das ganze fein. Ich habe mal in mehreren Functions im Errorhandler die Zeile "Call DisplayError" eingefügt, und es wird sauber der Function-Name angezeigt.
Matthias
TMC:
Hier noch ein Thread zum Thema: "Wie gebe ich meiner Function als Integer mit, wie denn diese eigentlich gelaufen ist"
http://www.atnotes.de/index.php?board=7;action=display;threadid=16062
sja:
Hallo @all,
das Thema ist für mich unheimlich aktuell. Ich versuche verzweifelt eine Lösung für einen Agent, der schon in der Produktion läuft, zu finden.
Der Agent habe ich schon in
http://www.atnotes.de/index.php?board=3;action=display;threadid=16004
gepostet.
Ihr habt mir damals schon mit dem Agent sehr geholfen. Für weitere Hilfe werde ich unheimlich dankbar.
Das Problem:
wenn es nur eine einzige Adresse gibt und zwar im Adressbuch nicht vorhanden, dann kommt Fehlermeldung, "AMgr: Agent ('LastUpdateMail' in "db.nsf') error message: Unable to send mail, no match found in Name & Address Book(s)", und Ausführung des Agent's wird unterbrochen. Ich habe versucht das Problem mit
On Error Resume Next
zu lösen. Ich habe so verstanden, dass in diesem Fall das Script soll weiter laufen, aber es wird wieder nach der Fehlermeldung unterbrochen.
Function MailSenden()
Projekt = PymDoc.GetItemValue("KundenProjektTitel")(0)
Kunde= PymDoc.GetItemValue("KundenName")(0)
Betreff = "..."
Message = "..."
VB = PymDoc.VFVB(0)
SE = PymDoc.VFSE(0)
VL = PymDoc.VFVL(0)
TL = PymDoc.VFTL(0)
If status = "Presales" Then
...
...
...
Else
'*** 21 ***
If nTagen = "21" Then
Prior = "1"
an(1) = SE
kopie(1) = VB
kopie(2) = TL
'*** 28 ***
Elseif nTagen = "28" Then
Prior = "1"
an(1) = SE
an(2) = TL
kopie(1) = VB
'*** 35 ***
Elseif nTagen = "35" Then
Prior = "1"
an(1) = VB
an(2) = SE
an(3) = TL
kopie(1) = VL
'*** 42 ***
Elseif nTagen = "42" Then
Prior = "1"
an(1) = VB
an(2) = SE
an(3) = VL
an(4) = TL
End If
'***************************************************
End If
ftarrayAn = Fulltrim(an)
ftarrayKopie = Fulltrim(kopie)
If Not ((ftarrayAn(1) = "") And (ftarrayKopie(1) = "")) Then
Set MailDoc = New NotesDocument(db)
MailDoc.Form = "Memo"
MailDoc.Subject = Betreff
MailDoc.SendTo = an
MailDoc.CopyTo = kopie
Set rtitem = New NotesRichTextItem( MailDoc , "Body" )
Call rtitem.AppendText( Message)
Call rtitem.AppendDocLink( PymDoc, Projekt)
Call rtitem.AddNewLine( 2 )
Call rtitem.AppendText( "Vielen Dank")
MailDoc.Importance = Prior
MailDoc.Send(False)
On Error Resume Next
End If
Erase an
Erase kopie
End Function
Vielen Dank im Voraus
Sofia
Glombi:
Das
On Error Resume Next
muss als erstes im Code stehen, denn sonst wirkt es erst ab da, wo es im Code vorkommt.
Generell ist On Error Resume Next mit Vorsicht zu genießen, da es mitunter gefährlich ist, einen Fehler zu ignorieren.
In Deinem Fall würde ich das
On Error Resume Next
vor dem
MailDoc.Send(False)
schreiben.
Andreas
koehlerbv:
... und danach muss wieder auf die "normale" Fehlerroutine umgeschaltet werden.
Man kann es aber auch ganz anders machen und auf On Error Resume Next ganz verzichten, indem man im normalen ErrorHandler die beiden Fehlernummern 4294 und 4295 abfragt (niemand gefunden bzw. doppelte Entsprechung). Ist Err = 4294 Or Err = 4295 dann folgt ein Resume Next, sonst wird der bisherige ErrorHandler weiter abgearbeitet.
Die ganze Sache ist aber sowieso mit Vorsicht zu geniessen, da docMail.Send an niemanden sendet, wenn nur bei einem der Fehler 4294 bzw. 4295 auftritt.
HTH,
Bernhard
Navigation
[0] Themen-Index
[#] Nächste Seite
[*] Vorherige Sete
Zur normalen Ansicht wechseln