Tecnología · GUÍA PRÁCTICA
¿CancelledError al esperar una tarea que cancelaste? No ocultes el apagado del controlador
La tarea hija puede terminar cancelada cuando el controlador recibe otra cancelación externa. Separa propiedad, limpieza, resultados y propagación.

La tarea hija puede terminar cancelada cuando el controlador recibe otra cancelación externa. Separa propiedad, limpieza, resultados y propagación.
CancelledError hereda de BaseException y normalmente se relanza tras limpiar. Task.cancel solicita cancelación; no garantiza que se acepte.
1. Nombra dueño y origen de cancelación
Lista controlador, hijos propios, quién cancela y destino de hermanos; no empieces con except-pass.
CancelledError al esperar al hijo puede ser su final o la cancelación externa del controlador; el tipo no prueba el origen.
2. Limpia el hijo en finally
Libera recursos del hijo en try/finally y normalmente propaga la cancelación. Otro await de limpieza también puede cancelarse.
La finalización asíncrona necesita un límite pequeño; no conviertas shield en un apagado infinito.
3. Elige TaskGroup o gather
Usa TaskGroup si el scope posee todos los hijos y el fallo debe cancelar hermanos; salir espera a todos.
Para resultados independientes, gather(return_exceptions=True) puede recoger cancelación del hijo; cancelar gather todavía se propaga.
4. Conserva la cancelación del controlador
Evita captura general alrededor de await child. Si es manual, registra estados y current_task().cancelling; vuelve a lanzar cancelación del controlador.
No uses uncancel solo para borrar estado. Suprimir cancelación es una decisión excepcional y deliberada.
5. Prueba cancelaciones simultáneas
Prueba hijo solo, controlador solo y ambos en el mismo turno; verifica limpieza, estados y propagación.
Al salir audita solo tareas propias y confirma que no quedan pendientes ni excepciones sin recuperar.
