TRY

From Recital Documentation Wiki
Revision as of 10:45, 16 March 2009 by Yvonnemilne (Talk | contribs)

Jump to: navigation, search

TRY…ENDTRY

Class

Error Handling and Debugging


Purpose

Structure to handle errors and exceptions within a block of code


Syntax

TRY

[<tryCommands>]

[CATCH [TO <memvar>] [WHEN <expL>]

[<catchCommands>]]

[THROW [<exp>]]

[EXIT]

[FINALLY

[<finallyCommands>]]

ENDTRY


See Also

ON ERROR, ERROR(), MESSAGE()


Description

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.

CATCH

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.

THROW

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 Recital 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.

EXIT

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.

FINALLY

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.

ENDTRY

The ENDTRY statement completes the structure.

Exception Class

PROPERTY DESCRIPTION
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.


Example

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


Products

Recital Database Server, Recital Mirage Server, Recital Terminal Developer