Используя isdigit(), как сказали до этого, пишешь условие, если встречается ошибка, то возвращается на ту же позицию:
balance = 0
@bot.message_handler(commands=["put"])
def get_put(message):
sent_put = bot.send_message(message.chat.id, "Сколько денег(в рублях) ты хочешь положить в копилку?")
bot.register_next_step_handler(sent_put, put)
def put(message):
global get_put
get_put = message.text
if (message.text).isdigit() == False:
error_message = bot.send_message(message.chat.id, "Ошибка! Попробуй написать только число(без букв и символов)")
bot.register_next_step_handler(error_message, put)
else:
balance += int(get_put)
spent_message = "Ты положил " + str(get_put) + "₽" + "\n" + "Теперь в копилке " + str(balance) + "₽"
bot.send_message(message.chat.id, spent_message, parse_mode="html")
И баланс наверное лучше задать глобально изначально, а то получится, что ты его заново создаешь при каждом пополнении.