hasattr () vs bloque try-except para lidiar con atributos inexistentes

if hasattr(obj, 'attribute'): # do somthing vs try: # access obj.attribute except AttributeError, e: # deal with AttributeError ¿Cuál debería preferirse y por qué?