Whenever an error is raised, it is usually the case that at least some MOO code
gets skipped over and never executed. Sometimes, it's important that a piece
of code always be executed, whether or not an error is raised. Use the
finally statement for these cases; it has the following
try statements-1 finally statements-2 endtry
First, statements-1 is executed; if it completes without raising an
error, returning from this verb, or terminating the current iteration of a
surrounding loop (we call these possibilities transferring control), then
statements-2 is executed and that's all that happens for the entire
Otherwise, the process of transferring control is interrupted and statments-2 is executed. If statements-2 itself completes without transferring control, then the interrupted control transfer is resumed just where it left off. If statements-2 does transfer control, then the interrupted transfer is simply forgotten in favor of the new one.
In short, this statement ensures that statements-2 is executed after control leaves statements-1 for whatever reason; it can thus be used to make sure that some piece of cleanup code is run even if statements-1 doesn't simply run normally to completion.
Here's an example:
try start = time(); object:(command)(@arguments); finally end = time(); this:charge_user_for_seconds(player, end - start); endtry