Package aquarium :: Package util :: Module TryFinally
[show private | hide private]
[frames | no frames]

Module aquarium.util.TryFinally

This is a convenient way to deeply nest try/finally statements.


Function Summary
  getIndexOfTask(tasks, f_enter, f_exit)
Get the index of a task based on its enter or exit function.
  normalizeTask(task)
Given a task, return it after filling in all the blanks in the tuples.
  tryFinally(tasks, handleFinallyException)
This is a convenient way to deeply nest try/finally statements.

Function Details

getIndexOfTask(tasks, f_enter=None, f_exit=None)

Get the index of a task based on its enter or exit function.

Once you have the index of the task, you can update the tasks list by putting another task before or after that index. This is useful for subclasses updating a list created by a superclass.

Raise IndexError if the index cannot be found.

f_enter, f_exit
You may specify the task using either is enter or exit function or both.

normalizeTask(task)

Given a task, return it after filling in all the blanks in the tuples.

That is, return:

((f_enter, f_enter_args, f_enter_kargs),
 (f_exit, f_exit_args, f_exit_kargs))

tryFinally(tasks, handleFinallyException=None)

This is a convenient way to deeply nest try/finally statements.

It is appropriate for complicated resource initialization and destruction. For instance, if you have a list of 50 things that need to get intialized and later destructed via using try/finally (especially if you need to create the list dynamically) this function is appropriate.

Given:

tasks = [
    ((f_enter_0, enter_0_args, enter_0_kargs),
     (f_exit_0, exit_0_args, exit_0_kargs)),

    ((f_enter_1, enter_1_args, enter_1_kargs),
     (f_exit_1, exit_1_args, exit_1_kargs)),

    ((f_enter_2, enter_2_args, enter_2_kargs),
     (f_exit_2, exit_2_args, exit_2_kargs))
]

Execute:

f_enter_0(*enter_0_args, **enter_0_kargs)
try:

    f_enter_1(*enter_1_args, **enter_1_kargs)
    try:

        f_enter_2(*enter_2_args, **enter_2_kargs)
        try:

            pass

        finally:
            try:
                f_exit_2(*exit_2_args, **exit_2_kargs)
            except Exception, e:
                handleFinallyException(e)

    finally:
        try:
            f_exit_1(*exit_1_args, **exit_1_kargs)
        except Exception, e:
            handleFinallyException(e)

finally:
    try:
        f_exit_0(*exit_0_args, **exit_0_kargs)
    except Exception, e:
        handleFinallyException(e)
tasks

See the example above. Note that you can leave out parts of the tuples by passing shorter tuples. For instance, here are two examples:

# Second tuple missing.
((f_enter_2, enter_2_args, enter_2_kargs),)

# Leave out args or args and kargs.
((f_enter_2,),
 (f_exit_2, exit_2_args))

Don't forget that a tuple of 1 item is written (item,). This is an amazingly easy thing to do.

handleFinallyException(e)
This is a callback that gets called if an exception, e, is raised in a finally block. By default, traceback.print_exc is called.

Generated by Epydoc 2.1 on Mon Jan 1 16:34:19 2007 http://epydoc.sf.net