[Baypiggies] Discussion for newbies/beginner night talks

Aahz aahz at pythoncraft.com
Wed Feb 14 05:00:13 CET 2007


On Tue, Feb 13, 2007, Shannon -jj Behrens wrote:
>
> #) Using try/except for flow control:
> 
> """Try to actually log the user in.
> 
> BASIC IDEA: A million things can go wrong, and there are several ways to
> succeed.  You want to check for the ways that can succeed and continue on as
> soon as one of them does.  You want the non-local flow of control that
> exceptions provide, but you need it for both success *and* failure.
> 
> """
> 
> def doLoginAction(self):
>     """Try to actually log the user in."""
>     class PasswordAccepted(Exception): pass
>     try:
>         if check_password():        # This may raise KeyError.
>             raise PasswordAccepted
>         do_more_expensive_work()
>         and_even_more_expensive_work()
>         if check_other_password():  #  This may raise KeyError.
>             raise PasswordAccepted
>         raise KeyError
>     except KeyError:
>         self.setError("Invalid username or password.")
>         return
>     except PasswordAccepted:
>         pass
>     continue_successfully()

This really should not call setError(), it should simply raise
ValueError (ValueError is for invalid data).  Here's a more-complicated
working example from my TextDB.py module illustrating multiple levels of
control flow managed with exceptions:

class Excluded(StandardError):
    pass

class Found(StandardError):
    pass

class NotFound(StandardError):
    pass

def _fuzzy_match(string, filter):
    return string.find(filter) >= 0

def _exact_match(string, filter):
    return string == filter

# Includes by default are ANDed; excludes are always ORed
# Use "|" to OR includes; "!" indicates exclude
def filter(db, FilterString=None, fields=None, FuzzyMatch=True):
    includes, excludes = _buildFilters(FilterString)
    if fields is not None:
        fields = re_comma_field.split(fields)
        for i in range(len(fields)):
            fields[i] = fields[i].lower()
    if FuzzyMatch:
        match = _fuzzy_match
    else:
        match = _exact_match
    result = []
    for record in db:
        if fields is None:
            curr_fields = record.keys()
        else:
            curr_fields = []
            for field in fields:
                if field in record:
                    curr_fields.append(field)
        try:
            for field in curr_fields:
                for item in record[field]:
                    item = item.lower()
                    for filter in excludes:
                        if match(item, filter):
                            raise Excluded
        except Excluded:
            continue
        try:
            for ORlist in includes:
                for filter in ORlist:
                    try:
                        for field in curr_fields:
                            for item in record[field]:
                                if match(item, filter):
                                    raise Found
                    except Found:
                        break
                else:
                    raise NotFound
        except NotFound:
            continue
        else:
            result.append(record)
    return result
-- 
Aahz (aahz at pythoncraft.com)           <*>         http://www.pythoncraft.com/

"I disrespectfully agree."  --SJM


More information about the Baypiggies mailing list