Level Extreme platform
Subscription
Corporate profile
Products & Services
Support
Legal
Français
Emulate TRY CATCH in VFP6
Message
From
17/02/2019 19:44:41
 
 
To
11/02/2019 10:07:47
General information
Forum:
Visual FoxPro
Category:
Coding, syntax & commands
Environment versions
Visual FoxPro:
VFP 6 SP3
Application:
Desktop
Miscellaneous
Thread ID:
01666266
Message ID:
01666486
Views:
89
Likes (1)
>>Hi all
>>
>>Is there a way to closely emulate the try...catch feature of later FoxPro in VFP6? I would prefer not to have to re-do the error handling of a utility, or at least reduce the re-work.
>>
>>Thanks
>
>In addition to Borislav Borissov's link, see also this one with some updated code to allow nesting:
>
>https://www.foxite.com/archives/trycatch-for-vfp6-0000405838.htm

I'm a few days late joining the discussion, but I was bored this Sunday.

I took the example from the link you provided and expanded it to include the FINALLY and the THROW features. Also, added the Error # condition argument to the CATCH.
Tested in VFP6 and VFP9. I also limited the comments because I know how much people hate them.
*
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
Greg Reichert
Previous
Next
Reply
Map
View

Click here to load this message in the networking platform