Structure to handle errors and exceptions within a block of code
[CATCH [TO <memvar>] [WHEN <expL>]
[THROW [EXCEPTION] [<exp>]]
TRY...CATCH...FINALLY is a command structure to handle errors and exceptions within a block of code. The <tryCommands> which follow the TRY statement are executed. If no error occurs in the <tryCommands> program execution continues from the FINALLY statement. If an error occurs, program execution jumps immediately to the CATCH statement. RETURN statements should not be issued within a TRY... ENDTRY block.
The CATCH block with its <catchCommands> handles the error. If the optional TO <memvar> clause is specified, a reference to an Exception object is stored to <memvar>. Please see the table below for Exception Class properties. If the optional WHEN <expL> clause is specified, the <expL> is evaluated and must be equal to True (.T.) for the <catchCommands> to be processed.
The THROW command causes an error to be thrown. This is primarily used to escalate an error to an outer TRY...CATCH...FINALLY structure. If the THROW is not in a nested TRY...CATCH...FINALLY structure, the error is handled by the active ON ERROR error handler or if none is active, by the default Lianja error handler, which will generate an error.mem error log. The optional <exp> is used to specify the UserValue property of a new Exception object.
The EXIT command is used to break out of the structure and execution continues from the FINALLY block or after the ENDTRY if no FINALLY block exists or the EXIT is called from the FINALLY block itself.
The FINALLY block <finallyCommands> are run unless a CANCEL or QUIT has been used to exit the structure. It can be used to clean up or release any resources used in the TRY or CATCH blocks.
The ENDTRY statement completes the structure.
|BaseClass||The System base class: 'Exception'.|
|Class||The class: 'Exception'.|
|ClassLibrary||The class library: for System classes.|
|Comment||Descriptive text string.|
|Details||Additional details relating to the Message property value.|
|ErrorNo||The error number for the last error that occurred (same as ERROR()). If the Exception object is created by a THROW <exp>, ErrorNo is 2071.|
|LineContents||The line that caused the error (same as MESSAGE(1)).|
|LineNo||The number of the line that caused the error (same as LINENO()).|
|Message||The error message (same as MESSAGE()).|
|Name||The name used to reference the object: 'EXCEPTION'.|
|Parent||The parent object.|
|ParentClass||The parent object class.|
|Procedure||The name of the procedure in which the error occurred.|
|StackLevel||The stack level at which the error occurred.|
|Tag||Used to store any additional string data required.|
|UserValue||The value passed by the THROW statement, which can be used as an object reference.|
try use example exclusive catch dialog box [Unable to open example table] endtry //Another example try use example exclusive catch to oExc if oExc.message = "ALIAS name already in use" select example exit else dialog box [Unable to open example table] endif endtry //Another example try ? [Outer Try] try use example exclusive catch to oExc oExc.UserValue = "Nested CATCH message: Unable to handle" ?[: Nested Catch] ?[ Inner Exception Object: ] ?[ Error: ] + str(oExc.ErrorNo) ?[ LineNo: ] + str(oExc.LineNo) ?[ Message: ] + oExc.Message ?[ Procedure: ] + oExc.Procedure ?[ StackLevel: ] + str(oExc.StackLevel) ?[ LineContents: ] + oExc.LineContents ?[ UserValue: ] + oExc.UserValue throw oExc finally ?[: Nested FINALLY executed ] endtry catch to oExc1 ?[: Outer CATCH ] ?[ Outer Exception Object: ] ?[ Error: ] + str(oExc1.ErrorNo) ?[ LineNo: ] + str(oExc1.LineNo) ?[ Message: ] + oExc1.Message ?[ Procedure: ] + oExc1.Procedure ?[ StackLevel: ] + str(oExc1.StackLevel) ?[ LineContents: ] + oExc1.LineContents ?[ ->UserValue becomes inner exception THROWn from nested TRY/CATCH ] if oExc1.UserValue.Message = "ALIAS name already in use" select example endif finally ?[: FINALLY executed ] endtry