Как-как, так же как и всегда: посмотреть, какое исключение возникает, отловить его и корректно обработать.
Например, пусть бот упал из-за ZeroDivisionError (ошибка деления на 0), тогда оборачиваем нужную часть бота или даже главный цикл бота в try ... except и как-то это разруливаем:
while True:
try:
bot.infinite_polling()
except ZeroDivisionError:
# чуть подождём, чтобы не было проблем, если падает слишком часто и быстро
time.sleep(5)
Разумеется, не всегда имеет смысл так делать прям вокруг главной функции, иногда лучше обработать исключение непосредственно в обработчике, где оно возникло, можно даже предпринять какие-то действия, например, добавить вызвавшего сбой пользователя во временнй чёрный список, чтобы игнорировать сообщения от него.