Блэд.
По поводу кэтча попробую вам всем объяснить.
1. Каждая асинхронная мидлварь (вернее, коллбэк аля async ctx => ctx) по определению промис-функция вызываемая next() в промисе async (ctx, next) => next().) .
2. Async/await/catch это сахар над Promise.then.
3. Для того, чтобы цепочка корректно работала и промис резолвися, необходимо что-то возвращать промис {async ctx => return ctx.reply} или async (ctx, next) => next()
4. bot.catch() это глобальная обертка над всей этой цепочкой ваших асинхронных мидлварей
5. Резюмируя: Для того, чтобы глобальный кэтч над тем что в пункте 1 в конце работал корректно, вам необходимо чтобы ваши async промисы возвращали другие промисы и цепочка не прерывалась.
TL;DR: возвращайте в async мидлварях промисы a.k.a. return next() или return ctx.reply() и будет вам щастье глобального обработчика
То есть не авейтить next()?