Domanda

Si consideri il seguente codice:

df = defer.Deferred()
def hah(_): raise ValueError("4")
df.addCallback(hah)
df.callback(hah)

Quando si corre, tale eccezione appena viene mangiato. Dov'è andato? Come posso ottenere che venga visualizzato? Facendo defer.setDebugging(True) non ha alcun effetto.

Lo chiedo perché altre volte, ottengo una stampa dicendo "errore non gestito in differita:". Come faccio a ottenere che ciò accada in questo caso? Vedo che se aggiungo un errback al df poi l'errback viene chiamato con l'eccezione, ma tutto quello che voglio fare è stampare l'errore e fare nient'altro, e non voglio aggiungere manualmente tale gestore ad ogni differita creo .

È stato utile?

Soluzione

L'eccezione è ancora seduto in differita. Ci sono due possibili risultati a questo punto:

  • Si potrebbe aggiungere un errback al differite. Non appena lo fai, verrà chiamato con un fallimento che contiene l'eccezione che è stata sollevata.
  • Si poteva lasciare la spazzatura differite essere raccolte (df eliminare in modo esplicito, o di ritorno dalla funzione, o perdere il riferimento in qualsiasi altro modo). Ciò fa scattare il '' errore non gestito in differita 'codice'.

A causa di un errback può essere aggiunto a una differita in qualsiasi momento (ad esempio, il primo punto di cui sopra), Deferreds non fare nulla con errori altrimenti non gestite subito. Non sanno se l'errore è in realtà gestita, o semplicemente non gestite finora. E 'solo quando il differito è garbage collection che può essere che nessun altro sta andando per gestire l'eccezione, in modo che, quando si arriva registrati.

In generale, si vuole essere sicuri di avere errbacks su Deferreds, proprio perché a volte è difficile prevedere quando una differite otterrà garbage collection. Potrebbe essere un lungo periodo di tempo, il che significa che potrebbe essere un lungo periodo di tempo prima che si impara a conoscere l'eccezione, se non avete il vostro errback collegato.

Questo non deve essere un terribile fardello. Qualsiasi differita (a) che viene restituita da una richiamata da un'altra differite (b) (cioè, quando accade concatenamento) passerà suoi errori insieme a b. Quindi (a) non ha bisogno errbacks in più su di esso per la registrazione e reporting, con (b) lo fa. Se si dispone di una singola operazione logica che è complicato e coinvolge molte operazioni asincrone, è quasi sempre il caso che tutte le Deferreds coinvolte in tali operazioni dovrebbero incanalare i loro risultati (di successo o insuccesso) a quella principale differite che rappresenta l'operazione logica. È spesso solo necessario uno speciale movimentazione comportamento su quello differito errore e che vi permetterà di gestire gli errori da una qualsiasi delle altre Deferreds coinvolte.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top