Wenn doch einmal Fehler passieren sollten
Es ist zwar sehr unwahrscheinlich, dass VFP-Programmierer Fehler machen, aber ab und an soll so etwas bereits vorgekommen sein... :-)
Deshalb ist auch eine umfangreiche Fehlerbehandlung und Protokollierung eingebaut worden.
Fehler bei der AFPXISAPI
Sollte die AFPX nicht mehr reagieren, oder ein anderer interner Windows-, IIS-Fehler auftreten, so wird dies direkt von der AFPXISAPI.DLL gemeldet und auch in der afperror.log im Verzeichnis der DLL gespeichert.
Die Meldung kann zB folgendermaßen aussehen:
2011.11.08 09:48:16 Progid is: afpx.afpx Method is:do Parameters are: parameters are: Invoke failed with err code 800706be: Der Remoteprozeduraufruf ist fehlgeschlagen.
AFPX.INI Settings
Sollte ein Fehler auftreten, kann man sich eine Email zusenden lassen.
Dafür müssen die Felder unter
[EMAIL]
; If you enter here a valid Emailadress, Senderadress and Emailhost, than an error out of one
; of your pages will be sent to you by email
; Your Emailhost
HOST=
; Your Emailadress
RECEIVER=
; Your Senderadress
SENDER=
gefüllt werden.
Sollte in der AFPX selbst ein Fehler auftreten, so wird der Fehler an den Programmierer gesendet, dessen emailadresse etc unter
; If an internal AFP-error occurs (a real BUG in the AFP) then an email should be sent.
; Please enter here the following values:
EHOST=
ERECEIVER=
ESENDER=
abgelegt werden muss.
der Debugmode
In der AFPX.INI kann bei
[DEBUG]
; This is the main switch for function monitoring.
; If the setting is OFF, the file AFPERROR.HTM will be sent but no error reports
; are generated in the browser.
MODE=OFF
eingestellt werden ob die komplette Fehlermeldung am Bildschirm angezeigt werden soll oder eine kurze Meldung angezeigt wird.
Ist eine afperror.htm im AFPX Verzeichnis, wird diese anstelle der eingebauten Meldung angezeigt.
fox.ldebug
Mit 'fox.ldebug = .t.' kann innerhalb der AFPX das Protokollieren kompletter Fehlermeldungen eingeschalten werden.
die ERR-Dateien
Wird direkt beim kompilieren bereits ein Fehler erkannt, so wird im Cacheverzeichnis eine .ERR Datei angelegt. In ihr steht die normale VFP9 Fehlermeldung.
Eine ausführlichere Meldung wird in der .runtime.err Datei abgelegt.
Fehlerdateien im Error-Verzeichnis
Sehr umfangreiche Fehlerinfos findet man nun im Errorverzeichnis.
Generell wird eine errors.dbf geführt.
Sie beinhaltet das aktuelle cCookie, Datum und Uhrzeit unter Tdatetime, die Fehlermeldung selbst unter cmemo, die Ausgaben von display memo und display status in dispmemo und dispstat und die aktuelle INI-Datei unter inifile.
Die Inhalte von display memo und display status werden in einer Memo_xxxxxxxx.txt und Stat_xxxxxxxxx.txt abgelegt.
Unter amem_xxxxxxxx.txt werden alle this.* Properties der AFPX gespeichert.
in einer error_xxxxxxxx.htm liegt die komplette Fehlermeldung in HTML-Form, welche auch an den Client gesendet wird, falls fox.ldebug auf .t. steht.
Um auch automatisch eine Fehlermeldung über ein SMS-System senden zu können, wird eine error_xxxxxxxx.sms erzeugt in der in Kurzform die wichtigsten Fehlermeldungen verzeichnet sind.
Fehlerdateien im Memo-Verzeichnis
die Daten aus display memo und display status werden unter Memo_xxxxxxxxx.txt und Stat_xxxxxxxx.txt abgelegt.
Fehlerdateien im AFPX-Verzeichnis
die komplette Fehlermeldung liegt noch zusätzlich unter dem Namen afperror_xxxxxxxxxx.htm im AFPX-Hauptverzeichnis.
Anmerkung: xxxxxxxxxx entspricht einem sys(2015)
Mailversand¶
In der AFPX ist die wwipstuff.dll als Email-dll in Verwendung.
Aufgrund von Lizenztechnischen Gründen kann ich diese natürlich nicht der AFPX beilegen.
Falls sie eine eigene Version eines Mailversandes verwenden, muss dies natürlich in der AFPX.PRG eingebaut werden. In diesem Fall suchen sie einfach nach wwipstuff, denn der Codeteil ist sehr einfach gehalten und immer mit einem try catch umranded.
Try
If File(this.cafppath+"wwipstuff.dll")
Declare Integer SendMail ;
IN (this.cafppath+"wwipstuff.dll") ;
STRING cFrom, ;
STRING cFromName, ;
STRING cTo, ;
STRING cCC, ;
STRING cBCC, ;
STRING cSubject, ;
STRING cMessage, ;
STRING cAttachment,;
STRING cMailHost,;
STRING @cError,;
STRING cContentType
Endif
lcerror=Space(513)
lcmessage1=lcstring
lcfehlhtm=this.cafppath+"afperror"+Sys(2015)+".htm"
lnhandle=Fcreate(lcfehlhtm)
Fwrite(lnhandle,lcmessage1)
Fclose(lnhandle)
lcmessage=lcmessage1
lcsenr=""
If Not Empty(this.cemailhost)
If File(this.cafppath+"wwipstuff.dll")
lnresult=SendMail(this.cemailsender, lcsenr,this.cemailreceiver, "","","Error - Email via Website",;
lcmessage,"",this.cemailhost,@lcerror,"text/html")
Endif
Endif
Catch
Endtry
Achten sie darauf, dass es mehrfach im Code vorkommt.
Anmerkung: An den Befehlen FCreate, Fwrite und Fclose sehen sie, wie alt dieser Code bereits sein muss, denn er entstand, bevor der strtofile() Befehl in VFP verfügbar war.