Frage

Betrachten Sie den folgenden Code ein:

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

Wenn es läuft, diese Ausnahme nur gegessen wird. Wo ist es hin? Wie kann ich es bekommen angezeigt werden? Doing defer.setDebugging(True) keine Wirkung hat.

Ich frage dies, weil ein anderes Mal, ich einen Ausdruck bekommen sagen: „Nicht behandelte Fehler in Deferred:“. Wie erhalte ich, dass in diesem Fall passieren? Ich sehe, dass, wenn ich einen errback zu df fügen Sie dann die errback mit Ausnahme aufgerufen wird, aber alles, was ich tun möchte, ist der Fehler drucken und nichts anderes tun, und ich möchte nicht manuell, dass Handler hinzufügen, um jeden latenten ich erstellen .

War es hilfreich?

Lösung

Die Ausnahme sitzt immer noch in den latenten. Es gibt zwei mögliche Ergebnisse an dieser Stelle:

  • Sie könnten eine errback zum latenten hinzufügen. Sobald Sie das tun, wird es mit einem Fehler aufgerufen die Ausnahme enthält, die ausgelöst wurde.
  • Sie könnten den Müll verschoben werden lassen gesammelt (explizit löschen df oder Rückkehr aus der Funktion oder verlieren den Bezug auf andere Weise). Dies löst die '' Nicht behandelte Fehler in Latente '' Code.

Da kann ein errback auf eine jederzeit (dh der erste Punkt oben) Latente hinzugefügt werden, Deferreds tun nichts mit sonst nicht behandelte Fehler sofort. Sie wissen nicht, ob der Fehler wirklich nicht behandelte, oder einfach nur so weit nicht behandelte. Es ist nur, wenn die latente wird Müll gesammelt, dass es eine sicher nicht sein kann, sonst wird die Ausnahme behandeln, so dass das, wenn es angemeldet wird.

In der Regel wollen Sie sicher sein, haben Sie errbacks auf Deferreds, gerade weil es manchmal schwierig ist, vorherzusagen, wann ein Deferred wird Müll gesammelt bekommen. Es könnte eine lange Zeit sein, die Mittel es eine lange Zeit sein könnte, bevor Sie über die Ausnahme lernen, wenn Sie angebracht keine eigene errback haben.

Das muss nicht eine schreckliche Last sein. Latent (a), die von einem Callback auf einem anderen latenten (b) zurückgeführt wird (dh, wenn Verkettungs geschieht) seinen Fehler entlang nach B übergeben. So (a) benötigen keine zusätzliche errbacks auf sie für die Protokollierung und Reporting, nur (b) der Fall ist. Wenn Sie eine einzelne logische Aufgabe haben, die kompliziert und beinhaltet viele asynchrone Operationen, dann ist es fast immer der Fall, dass alle der Deferreds in diesen Operationen beteiligt sind, sollten ihre Ergebnisse kanalisieren (Erfolg oder Misserfolg) zu einer Haupt Latente, die die logische Operation darstellt. Sie brauchen oft nur spezielle Fehlerverhalten auf dieser latenten eine Handhabung, und das lassen Sie Fehler aus einem der anderen Deferreds beteiligt behandeln.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top