If you call a function or event dynamically, different conditions create different results, from no effect to an execution error. The tables in this section illustrate this.
The rules for functions are similar to those for events, except functions must exist: if a function is not found, an error always occurs. Although events can exist without a script, if a function is defined it has to have code. Consider the following statements:
This statement calls a function without looking for a return value:
object.DYNAMIC funcname( )
This statement looks for an integer return value:
int li_int
li_int = object.DYNAMIC funcname( )
This statement looks for an Any return value:
any la_any
la_any = object.DYNAMIC funcname( )
The following table uses these statements as examples.
Consider these statements:
This statement calls an event without looking for a return value:
object.EVENT DYNAMIC eventname( )
This example looks for an integer return value:
int li_int
li_int = object.EVENT DYNAMIC eventname( )
This example looks for an Any return value:
any la_any
la_any = object.EVENT DYNAMIC eventname( )
The following table uses these statements as examples.
You can surround a dynamic function call in a try-catch block to prevent the application from terminating when an execution error occurs. Although you can also handle the error in the SystemError event, you should not allow the application to continue once the SystemError event is invoked—the SystemError event should only clean up and halt the application.
For information on using try-catch blocks, see the section on exception handling in the Resource Guide.
Function arguments are part of the function’s definition. Therefore, if the arguments do not match (a compatible match, not an exact match), it is essentially a different function. The result is the same as if the function did not exist.
If you call an event dynamically and the arguments do not match, the call fails and control returns to the calling script. There is no error.
Calling functions and events dynamically opens up your application to potential errors. The surest way to avoid these errors is to always make static calls to functions and events. When that is not possible, your design and testing can ensure that there is always an appropriate function or event with the correct return datatype.
One type of error you can check for and avoid is data conversion errors.
The preceding tables illustrated that a function or event can return a null value either as an Any variable or as a variable of the expected datatype when a function or event definition exists but is not implemented.
If you always assign return values to Any variables for dynamic calls, you can test for null (which indicates failure) before using the value in code.
This example illustrates the technique of checking for null before using the return value.
any la_any integer li_gotvalue la_any = object.DYNAMIC uf_getaninteger( ) IF IsNull(la_any) THEN ... // Error handling ELSE li_gotvalue = la_any END IF
Copyright © 2004. Sybase Inc. All rights reserved. |
![]() |