def run_action(self, ar):
        
        a = ar.bound_action.action
        if self.site.log_each_action_request and not a.readonly:
            flds = []
            A = flds.append
            a = ar.bound_action.action
            # A(a.__class__.__module__+'.'+a.__class__.__name__)
            A(ar.get_user().username)
            A(ar.bound_action.full_name())
            A(obj2str(ar.master_instance))
            A(obj2str(ar.selected_rows))
            # A(format_request(ar.request))
            logger.info("run_action {0}".format(' '.join(flds)))
            # logger.info("run_action {0}".format(ar))
        try:
            a.run_from_ui(ar)
            if a.parameters and not a.no_params_window:
                ar.set_response(close_window=True)
        except exceptions.ValidationError as e:
            # logger.info("20150127 run_action %r", e)
            ar.error(ar.ah.actor.error2str(e), alert=True)
        except Warning as e:
            ar.error(e, alert=True)

        return self.render_action_response(ar)
test join where child raised exception, checks that parent receives exception
dataset/ETHPy150Open lsaffre/lino/lino/core/kernel.py/Kernel.run_action--crossover with--dataset/ETHPy150Open concurrence/concurrence/test/testcore.py/TestTasklet.testJoinException