def send_catch_log(signal=Any, sender=Anonymous, *arguments, **named): """Like pydispatcher.robust.sendRobust but it also logs errors and returns Failures instead of exceptions. """ dont_log = named.pop('dont_log', None) spider = named.get('spider', None) responses = [] for receiver in liveReceivers(getAllReceivers(sender, signal)): try: response = robustApply(receiver, signal=signal, sender=sender, *arguments, **named) if isinstance(response, Deferred): log.msg(format="Cannot return deferreds from signal handler: %(receiver)s", level=log.ERROR, spider=spider, receiver=receiver) except dont_log: result = Failure() except Exception: result = Failure() log.err(result, "Error caught on signal handler: %s" % receiver, \ spider=spider) else: result = response responses.append((receiver, result)) return responses
def logerror(failure, recv): if dont_log is None or not isinstance(failure.value, dont_log): log.err(failure, "Error caught on signal handler: %s" % recv, \ spider=spider) return failure