* CLEAR CLEAR ALL SET STEP ON LOCAL lvResult lvResult = .T. ON ERROR DO myTrap WITH ERROR(),MESSAGE(),MESSAGE(1),PROGRAM(),LINENO() LOCAL oExc =TRY() x=1 DO NestedTry && if comment this line, the FINALLY portion occurs. *** the EVALUATE() is used so the code will compile without error *** IF NOEX() && no error occured yet EVALUATE( [sdfsd] ) ENDIF IF NOEX() && no error occured yet EVALUATE( STR("") ) ENDIF IF NOEX() x=2 ENDIF * CATCH block DO CASE CASE CATCH(@oExc, 12) && variable is not found. ? oExc.ERRORNO, oExc.MESSAGE CASE CATCH(@oExc) ? oExc.ERRORNO, oExc.MESSAGE =THROW(@oExc) RETURN .F. ENDCASE =FINALLY() ? "Finally we are here." =ENDTRY() ? "complete" ON ERROR RETURN *------------------------------------------------------------ * nested Try...Catch *------------------------------------------------------------ PROCEDURE NestedTry LOCAL oExc =TRY() cmd = [command] &cmd DO CASE *!* CASE CATCH(@oExc,999) *!* MESSAGEBOX(ex.Message + " at " + ex.Procedure) CASE CATCH(@oExc) ? oExc.ERRORNO, oExc.MESSAGE =THROW(@oExc) RETURN .F. ENDCASE =ENDTRY() ENDPROC *------------------------------------------------------------ * master error trap *------------------------------------------------------------ PROCEDURE myTrap( pnErrorNo, pcMessage, pcSource, pcProcedure, pnLineNo ) ? pnErrorNo, pcMessage, pcSource, pcProcedure, pnLineNo ENDPROC *------------------------------------------------------------ * Try ... CATCH routines *------------------------------------------------------------ PROCEDURE TRY IF VARTYPE(gcTRYOnError)="U" PUBLIC gcTRYOnError,goTRYEx,gnTRYNestingLevel gnTRYNestingLevel = 0 ENDIF gcTRYOnError = ON("ERROR") goTRYEx = NULL gnTRYNestingLevel = gnTRYNestingLevel + 1 IF gnTRYNestingLevel = 1 ON ERROR tryCatch(ERROR(), MESSAGE(), MESSAGE(1), PROGRAM(), LINENO()) ENDIF ENDPROC PROCEDURE CATCH(poEx, pnErrNo) IF PCOUNT() >= 1 poEx = goTRYEx ENDIF LOCAL llResult llResult = .F. DO CASE CASE ISNULL(goTRYEx) *-- no error CASE PCOUNT() < 2 *-- not looking a error llResult = .T. CASE goTRYEx.ERRORNO = VAL(TRANSFORM(pnErrNo)) llResult = .T. ENDCASE RETURN llResult ENDPROC PROCEDURE THROW( poEx ) =ENDTRY() ERROR poEx.ERRORNO, poEx.MESSAGE ENDPROC PROCEDURE FINALLY * used as a place hold only in the code. ENDPROC PROCEDURE ENDTRY gnTRYNestingLevel = gnTRYNestingLevel - 1 goTRYEx = NULL IF gnTRYNestingLevel = 0 IF !EMPTY(gcTRYOnError) ON ERROR &gcTRYOnError ELSE ON ERROR ENDIF ENDIF ENDPROC FUNCTION NOEX() RETURN ISNULL(goTRYEx) ENDFUNC PROCEDURE tryCatch(pnErrorNo, pcMessage, pcSource, pcProcedure, pnLineNo) goTRYEx = CREATE("Exception") WITH goTRYEx .ERRORNO = pnErrorNo .MESSAGE = pcMessage .LINECONTENTS = pcSource .PROCEDURE = pcProcedure .LINENO = pnLineNo .USERVALUE = "" #IF VERSION(5)=600 .STACKLEVEL = 0 #ELSE LOCAL ARRAY laDummyStack[1] .STACKLEVEL = ASTACKINFO(laDummyStack) #ENDIF .DETAILS = SYS(2018) ENDWITH ENDPROC #IF VERSION(5)=600 DEFINE CLASS EXCEPTION AS CUSTOM ERRORNO = 0 MESSAGE = "" LINECONTENTS = "" USERVALUE = "" STACKLEVEL = 0 DETAILS = "" LINENO = 0 PROCEDURE = "" ENDDEFINE #ENDIF