.. index:: single: User-specified Error Handling single: Error Handling single: G7 Command; try single: G7 Command; catch single: try-catch Routine User-specified Error Handling ============================= The *try-catch* combination loosely clones similar routines in C++. Within the brackets following each may be any collection of *G7* routines, including other *try-catch* blocks. If execution of any of the s within the *try* block produces an internal error signal, or if a user-specified error is thrown with the *return* , then execution of the code in the *try* block ceases and execution of the code in the *catch* block begins. Otherwise, the *catch* block is ignored. For example, consider the link-series *ls*. The routine will fail if the value of the guide series is zero in the base period. Ordinarily, this will cause *G7* to stop execution of the script and report an error. If, on the other hand, the *ls* is nested within a *try* block, then if an error occurs the alternative block of code following the *catch* will be executed. In the following example, suppose that we prefer to use guide series y when it is available, and when it is not we rely on guide series z. We first try to extend series x using series y beginning in 2005, and if the value of y is zero in 2005, then we repeat the exercise using series 'z':: try{ ls x y 2005 f } catch{ try{ ls x z 2005 f } catch{ ic Sorry. No data in y or z. pause } } The *try-catch* routine works well with many other s and has a wide variety of useful applications. Note again that *try-catch* blocks can be nested, so that several alternatives can be tried before *G7* gives up in despair. Often, anticipated errors alternatively can be handled with *if-else* routines. For example, the *f* will fail if a right-hand-side variable is not found. *G7* can handle such failures elegantly either by nesting the *f* in a *try* block or by using the *if* , with the *exists* function, to test for the availability of the variable before attempting to use it.