@strizhechenko доехал домой, добрался до репла питона, проверил.

В общем случае, SIGINT у тебя вызывает KeyboardException в текущей исполняющейся строке питона.

Для asyncio есть несколько вариантов развития событий, в зависимости от того, чем занимается луп прямо сейчас.

Вариант 1: луп исполняет какой-то синхронный код. Тогда это исключение вылетит на этот синхронный код, провалится наверх до gather'а, и дальше в зависимости от параметров gather'а будет обрабатываться.

Вариант 2: луп что-то ждёт. В этом случае оно прилетит в сам луп, и луп тебе отменит все корутины, какие найдет (в том числе все таски твои).
В итоге await gather кинет исключение и оно поедет наверх.

Вот на этом можно поиграться: yaso.su/dAlePnTi

Учитывай, что CancelledError наследуется от BaseException, и через обычный except Exception его не поймать.