'Processing the task, catching exceptions and logs, return a `ProcessorResult` object'

def run_task(self, module, task, response):

    self.logger = logger = module.logger
    result = None
    exception = None
    stdout = sys.stdout
    self.task = task
    if isinstance(response, dict):
        response = rebuild_response(response)
    self.response = response
    self.save = (task.get('track') or {}).get('save', {})
    try:
        if self.__env__.get('enable_stdout_capture', True):
            sys.stdout = ListO(module.log_buffer)
        self._reset()
        result = self._run_task(task, response)
        if inspect.isgenerator(result):
            for r in result:
                self._run_func(self.on_result, r, response, task)
        else:
            self._run_func(self.on_result, result, response, task)
    except Exception as e:
        logger.exception(e)
        exception = e
    finally:
        follows = self._follows
        messages = self._messages
        logs = list(module.log_buffer)
        extinfo = self._extinfo
        save = self.save
        sys.stdout = stdout
        self.task = None
        self.response = None
        self.save = None
    module.log_buffer[:] = []
    return ProcessorResult(result, follows, messages, logs, exception, extinfo, save)
