Pregunta

Considere el siguiente código:

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

Cuando se ejecuta, esta excepción solo se come. ¿A donde se fué? ¿Cómo puedo conseguir que se muestre? Haciendo defer.setDebugging(True) no tiene ningún efecto.

Lo pregunto porque otras veces, me sale una copia impresa que dice "error desconocida en diferido:". ¿Cómo consigo que eso suceda en este caso? Veo que si añado un errback a df entonces el errback se llama con la excepción, pero todo lo que quiero hacer es imprimir el error y no hacer nada más, y yo no quiero que añadir manualmente a cada manejador diferido creo .

¿Fue útil?

Solución

La excepción está todavía sentado en el diferido. Hay dos resultados posibles en este punto:

  • Se podría añadir un errback a la Diferido. Tan pronto como lo hace, se llamará con un fracaso que contiene la excepción que se planteó.
  • Usted puede dejar que la basura diferidos sean recogidos (df eliminar explícitamente, o retorno de la función, o perder la referencia de cualquier otro modo). Esto desencadena el '' error desconocida en diferido 'código'.

Debido a que un errback se puede añadir a un diferido en cualquier momento (es decir, el primer punto anterior), Deferreds no hace nada con errores de otro modo no controladas de inmediato. Ellos no saben si el error es realmente no controlada, o simplemente no controlada hasta ahora. Es sólo cuando la Diferido se recoge la basura que puede estar seguro de que nadie más va a manejar la excepción, por lo que de cuando se pone registran.

En general, usted quiere estar seguro de que tiene errbacks en Deferreds, precisamente porque a veces es difícil de predecir cuando un Diferido conseguirá basura recogida. Podría ser mucho tiempo, lo que significa que podría ser un largo tiempo antes de aprender acerca de la excepción, si usted no tiene su propio errback adjunta.

Esto no tiene por qué ser una carga terrible. Cualquier Diferido (a) que se devuelve desde una devolución de llamada en otra Diferido (b) (es decir, cuando el encadenamiento ocurre) pasará sus errores a lo largo de a b. Así que (a) no necesita errbacks adicional en ella para el registro y la notificación, solamente (b) lo hace. Si usted tiene una sola tarea lógica que se complica e implica muchas operaciones asíncronas, es casi siempre el caso de que todos los Deferreds implicados en esas operaciones deben canalizar sus resultados (éxito o fracaso) de principal diferido que representa la operación lógica. A menudo se necesita solamente en el comportamiento que uno diferido de gestión de errores especial, y que le permitirá manejar los errores de cualquiera de los otros Deferreds involucrados.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top