Like ``pydispatcher.robust.sendRobust()`` but it also logs errors and returns Failures instead of exceptions.
(
signal: TypingAny = Any,
sender: TypingAny = Anonymous,
*arguments: TypingAny,
**named: TypingAny,
)
| 34 | |
| 35 | |
| 36 | def send_catch_log( |
| 37 | signal: TypingAny = Any, |
| 38 | sender: TypingAny = Anonymous, |
| 39 | *arguments: TypingAny, |
| 40 | **named: TypingAny, |
| 41 | ) -> list[tuple[TypingAny, TypingAny]]: |
| 42 | """Like ``pydispatcher.robust.sendRobust()`` but it also logs errors and returns |
| 43 | Failures instead of exceptions. |
| 44 | """ |
| 45 | dont_log = named.pop("dont_log", ()) |
| 46 | dont_log = tuple(dont_log) if isinstance(dont_log, Sequence) else (dont_log,) |
| 47 | dont_log += (StopDownload,) |
| 48 | spider = named.get("spider") |
| 49 | responses: list[tuple[TypingAny, TypingAny]] = [] |
| 50 | for receiver in liveReceivers(getAllReceivers(sender, signal)): |
| 51 | result: TypingAny |
| 52 | try: |
| 53 | response = robustApply( |
| 54 | receiver, *arguments, signal=signal, sender=sender, **named |
| 55 | ) |
| 56 | if isinstance(response, Deferred): |
| 57 | logger.error( |
| 58 | "Cannot return deferreds from signal handler: %(receiver)s", |
| 59 | {"receiver": receiver}, |
| 60 | extra={"spider": spider}, |
| 61 | ) |
| 62 | except dont_log: |
| 63 | result = Failure() |
| 64 | except Exception: |
| 65 | result = Failure() |
| 66 | logger.error( |
| 67 | "Error caught on signal handler: %(receiver)s", |
| 68 | {"receiver": receiver}, |
| 69 | exc_info=True, |
| 70 | extra={"spider": spider}, |
| 71 | ) |
| 72 | else: |
| 73 | result = response |
| 74 | responses.append((receiver, result)) |
| 75 | return responses |
| 76 | |
| 77 | |
| 78 | def send_catch_log_deferred( |