I often enclose error prone expressions in Try() without Throw(). The placement of Try() – within the function or "around" the function call – depends if I only want to escape parts of the function or escape it completely in case of an exception. Throw() halts execution and I tend to use it mainly for debugging.
Compare these examples and their output:
//Try() inside the function escapes chosen parts of function, script execution continues.
exsqr = Function( {x},
x2 = Try( x * x, "Error, move on!" );
Show( "Show this even if x is NaN" );
x2;
);
sq = exsqr( "q" );
Show( sq, "function escape failed, but script continued" );
//Try() enclosing the function call escapes function, script execution continues.
exsqr = Function( {x},
x2 = x * x;
Show( "Don't show this if x is NaN" );
x2;
);
sq = Try( exsqr( "q" ) );
Show( sq, "function escape succeeded!" );
//Try() with Throw() escapes function and script.
exsqr = Function( {x},
x2 = Try( x * x, Throw( "Error, stop here!: " || Char( exception_msg ) ) );
Show( "Don't show this if x is NaN" );
);
sq = exsqr( "q" );
Show( sq, "script stopped!" );