Сделал телеграм бота для решения квадратных уравнений, но при вводе буквы или каких либо других символов, бот крашится. Помогите пожалуйста

Рейтинг: 0Ответов: 2Опубликовано: 09.01.2023
import telebot
from telebot import types
import math
bot=telebot.TeleBot("токен")
@bot.message_handler(commands=["start"])
def start(message):
     prikaz=f'👋Привет {message.from_user.first_name},Я бот для решений квадратных уравнений \nАктивируй команду /help,чтоб начать решать'
     bot.send_message(message.chat.id,prikaz)
def is_number(_str):
    try:
        int(_str)
        return True
    except ValueError:
        return False
@bot.message_handler(content_types=["text"])
def k (message):
    if message.text=="/help":
        bot.send_message(message.from_user.id,'Введи значение а')
        bot.register_next_step_handler(message,a)
    else:
        bot.send_message(message.from_user.id,"Напиши /help")
def a(message):
    global a
    a = float(message.text)
    if is_number(a):
        bot.send_message(message.chat.id,'Введи значение b')
        bot.register_next_step_handler(message,b)
    else:
        a = float(message.text,"Попробуй еще раз")
def b(message):
    global b
    b=float(message.text)
    bot.send_message(message.chat.id,'Введи значение c')
    bot.register_next_step_handler(message,c)
def c(message):
    global c
    c=float(message.text)
    D = b * b - 4 * a * c
    bot.send_message(message.from_user.id,"Дискриминант =%.2f"%D)
    if D < 0:
        bot.send_message(message.from_user.id, "Корней нет")
        bot.send_message(message.from_user.id, "Напиши /help,чтобы начать сначала")
    elif D == 0:
        bot.send_message(message.from_user.id, "1 корень")
        x1 = (-b + math.sqrt(D)) / 2 * a
        bot.send_message(message.from_user.id,"Первый корень=%.2f"&x1)
        bot.send_message(message.from_user.id, "Напиши /help,чтобы начать сначала")
    elif D>0:
        bot.send_message(message.from_user.id, "Будет 2 корня")
        x1=(-b+math.sqrt(D))/2*a
        x2=(-b-math.sqrt(D))/2*a
        bot.send_message(message.from_user.id,"Первый корень=%.2f \nВторой корень=%.2f"%(x1,x2))
        bot.send_message(message.from_user.id, "Напиши /help,чтобы начать сначала")
bot.polling(none_stop=True)

Ответы

▲ 0

Валидируй данные прежде чем перейти к вычислениям с их использованием. К примеру, передали на вход тебе значение а, проверь является ли оно числом. По умолчанию а имеет тип str, у него есть замечательные методы, проверяющие является ли эта строка валидным числом: .isdigit(), .isnumeric(), и .isdecimal(). У них свои нюансы, лучше отдельно о них прочитать, например тут. Лучше использовать .isdecimal(), он надёжнее.

if a.isdecimal():
   # все окей, можно идти дальше
else:
   # строка не является числом, тут можно попросить пользователя снова ввести а и напомнить ему, что а должно быть числом.

Можно это реализовать в виде цикла, условием выхода из которого будет являться валидность a.

while not a.isdecimal():
   # строка не является числом, тут можно попросить пользователя снова ввести а и напомнить ему, что а должно быть числом.
# все окей, можно идти дальше

Если же предполагается, что а может быть дробью, то для этого случая нет готового решения, можно функцию валидации реализовать самостоятельно.

▲ 0

Попробуй передавать текст вводимый пользователем в данную функцию проверки на число

def is_number(_str):
    try:
        int(_str)
        return True
    except ValueError:
        return False

Например ты передаешь в функцию значение a,

if is_number(a)
  Твой код если это число
else:
  Твой код если это не число например выводишь "Введите целое число"