La domanda:
mi piacerebbe sedano per la cattura di eccezioni e di scrivere in un file di log, invece di apparentemente loro ingoiare ...
La parte superiore corrente la risposta qui è così così per gli scopi di una soluzione professionale. Molti sviluppatori di Python considereranno l'errore di blank catching, caso per caso, di una bandiera rossa. Un ragionevole avversione per questo è stato ben articolato in un commento:
Aspetta, mi aspetto che ci sia qualcosa di registrato nel registro dei lavoratori, per lo meno, per ogni compito che non riesce ...
Celery fa l'eccezione, non sta facendo ciò che l'OP voleva che facesse con esso (lo memorizza nel backend del risultato). Il seguente elenco è il meglio che internet ha da offrire su questo problema. È un po 'datato, ma nota il numero di forchette e stelle.
https://gist.github.com/darklow/c70a8d1147f05be877c3
Il nocciolo sta prendendo il caso fallimento e fare qualcosa di personalizzato con esso. Questo è un superset del problema dell'OP. Ecco come regolare la soluzione nel Gist per registrare l'eccezione.
import logging
logger = logging.getLogger('your.desired.logger')
class LogErrorsTask(Task):
def on_failure(self, exc, task_id, args, kwargs, einfo):
logger.exception('Celery task failure!!!1', exc_info=exc)
super(LogErrorsTask, self).on_failure(exc, task_id, args, kwargs, einfo)
Sarà comunque necessario per assicurarsi che tutte le attività ereditano da questa classe compito, e il nocciolo mostra come fare questo se si sta utilizzando il @task
decoratore (con il base=LogErrorsTask
kwarg).
Il vantaggio di questa soluzione è di non annidare il codice in altri contesti di prova eccetto. Questo è piggyback sul percorso del codice di errore che il sedano sta già utilizzando.
Cosa voglio da sedano? Non potrei crash come app desktop. Potresti usare due semplici modi. 1. Utilizzare il risultato backend e contrassegnare l'attività come fallita. 2. Avvolgi tutto il tuo codice in sedano per provare tranne. – Rustem
@Rustem Mi piacerebbe che Celery rilevi eccezioni e le scriva in un file di registro invece di ingannarle apparentemente ... –