python / expert
Snippet
Erfassen und Strukturieren von Ausnahmen in Benutzerdefinierten Signal-Handlern
Djangos `send_robust` erm��glicht es Signal-Handlern fehlzuschlagen, ohne die Ausführung zu unterbrechen, indem Ausnahmen als Rückgabewerte geliefert werden. Dieser Helper sammelt diese Fehler in einer strukturierten Meldung.
snippet.py
python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
from django.dispatch import Signalfrom django.core.exceptions import ValidationErrorimport logginglogger = logging.getLogger(__name__)user_action_signal = Signal()def safe_signal_dispatch(signal, sender, **kwargs):results = signal.send_robust(sender=sender, **kwargs)errors = []for receiver, response in results:if isinstance(response, Exception):logger.error(f'Error in {receiver}: {response}')errors.append((receiver, response))if errors:raise ValidationError(f'Signal dispatch completed with {len(errors)} errors.')return results
django
Erklärung
1
user_action_signal = Signal()
Erstellt eine Instanz eines benutzerdefinierten Django-Signal-Dispatchers.
2
results = signal.send_robust(sender=sender, **kwargs)
Führt alle registrierten Receiver aus, fängt Fehler pro Handler ab und liefert Paare aus (Receiver, Antwort_oder_Ausnahme).
3
if isinstance(response, Exception):
Prüft das Ergebnis jedes Handlers, um festzustellen, ob im Signal-Receiver eine nicht abgefangene Ausnahme aufgetreten ist.