Pergunta

Considere o seguinte código:

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

Quando funciona, essa exceção é comida. Para onde foi? Como posso fazer com que seja exibido? Fazendo defer.setDebugging(True) não tem efeito.

Pergunto isso porque outras vezes, recebo uma impressão dizendo "erro não tratado em adiado:". Como faço para que isso aconteça neste caso? Vejo que se eu adicionar um errrô df Em seguida, o Errback é chamado com a exceção, mas tudo o que quero fazer é imprimir o erro e não fazer mais nada, e não quero adicionar manualmente esse manipulador a cada diferido que eu crio.

Foi útil?

Solução

A exceção ainda está sentada no diferido. Existem dois resultados possíveis neste momento:

  • Você pode adicionar um erro ao diferido. Assim que você fizer, será chamado com uma falha contendo a exceção que foi levantada.
  • Você pode deixar o lixo diferido coletado (excluir explicitamente df, ou retornar da função, ou perder a referência de qualquer outra maneira). Isso desencadeia o código '' não tratado no código diferido '.

Como um erro pode ser adicionado a um diferido a qualquer momento (ou seja, o primeiro ponto acima), os diferidos não fazem nada com erros não atendidos imediatamente. Eles não sabem se o erro é realmente não tratado ou apenas não atendido até agora. Somente quando o diferido é o lixo coletado que pode ter certeza de que ninguém mais lidará com a exceção, então é quando ele é registrado.

Em geral, você deseja ter certeza de que tem erros de adiamentos, precisamente porque às vezes é difícil prever quando um diferido recebe o lixo coletado. Pode demorar muito tempo, o que significa que pode demorar muito tempo antes de você aprender sobre a exceção se você não tiver seu próprio erro.

Isso não precisa ser um fardo terrível. Qualquer diferido (a) que seja devolvido de um retorno de chamada em outro diferido (b) (ou seja, quando o encadeamento acontecer) transmitirá seus erros junto com b. Portanto, (a) não precisa de erros extras para registrar e relatar, apenas (b). Se você possui uma única tarefa lógica que é complicada e envolve muitas operações assíncronas, quase sempre é o caso de que todos os diferidos envolvidos nessas operações devem canalizar seus resultados (sucesso ou falha) para um principal adiado que representa a operação lógica. Muitas vezes, você precisa apenas de um comportamento especial de lidar com um diferido, e isso permitirá que você lide com erros de qualquer um dos outros diferidos envolvidos.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top