ON ERROR ErrorHandler(ERROR(),PROGRAM(),LINENO()) ********************* FUNCTION ErrorHandler ********************* LPARAMETER nError,cMethod,nLine LOCAL lcErrorMsg,lcCodeLineMsg, lnSessionID ?? CHR(7) && Ring the bell WAIT CLEAR lnError = nError IF lnError = 1001 && Feature not available - set step on RETURN .T. ENDIF lnLine = nLine lnSessionID = _SCREEN.DataSessionID lcErrorMsg=STR(nError) + ' - ' + MESSAGE()+CHR(13)+CHR(13) lcErrorMsg=lcErrorMsg+"Method: "+cMethod lcCodeLineMsg=MESSAGE(1) IF BETWEEN(nLine,1,10000) AND NOT lcCodeLineMsg="..." lcErrorMsg=lcErrorMsg+CHR(13)+"Line: "+ALLTRIM(STR(nLine)) IF NOT EMPTY(lcCodeLineMsg) lcErrorMsg=lcErrorMsg+CHR(13)+CHR(13)+lcCodeLineMsg ENDIF ENDIF IF lnError != 1958 lcErrorMsg = lcErrorMsg +CHR(13)+ " Application will close itself." ENDIF IF MESSAGEBOX(lcErrorMsg,16,_screen.Caption)= 1 && OK (no cancle) IF lnError = 1958 RETURN .T. ENDIF lForm = .F. IF TYPE("_Screen.ActiveForm") = "O" poActiveForm = _Screen.ActiveForm IF UPPER(poActiveForm.BaseClass) == "FORM" lForm = .T. lnSessionID = poActiveForm.DataSessionID ENDIF ENDIF IF TXNLEVEL() > 0 IF lForm SET DATASESSION TO poActiveForm.DataSessionID ENDIF ROLLBACK UNLOCK ALL ENDIF IF !USED("SyLogError") USE SyLogError IN 0 ENDIF INSERT INTO SyLogError (dError, cUserID, nError, cMess, cMess1, cMess2, cProgram, nLine) ; VALUES(DATETIME(), sgcUserID, lnError, MESSAGE(), MESSAGE(1), SYS(2018), cMethod, lnLine ) USE IN SyLogError SET DATASESSION TO lnSessionID CANCEL ENDIF RETURN