我正在尝试开发简单的电报机器人。刚开始时,我使用轮询来测试机器人。
import telebot
bot = telebot.TeleBot(token)
# decorator indicates that on_text() should be called when
# user sends text message to the bot
@bot.message_handler(content_types=['text'])
def on_text(message):
# send message to user with uid "1" and with text '' (wrong, should cause an error)
bot.send_message(1, '')
bot.polling()
当我向机器人发送文本时,它崩溃了:
A request to the Telegram API was unsuccessful. Error code: 400. Description: Bad Request: message text is empty
这是预期的行为,我希望我的代码在控制台中报告错误。
但是当我切换到 Flask 时,我注意到,该机器人不再打印任何错误,而且,它只是返回错误,就像
try: <sum code> except: return
。
import flask
bot = telebot.TeleBot(token)
app = flask.Flask(__name__)
@app.route('/', methods=['POST'])
def webhook():
if flask.request.headers.get('content-type') == 'application/json':
json_string = flask.request.get_data().decode('utf-8')
update = types.Update.de_json(json_string)
bot.process_new_updates([update])
return ''
else:
flask.abort(403)
@bot.message_handler(content_types=['text'])
def on_text(message):
bot.send_message(1, '')
if __name__ == '__main__':
app.run()
这不会在短信上出现任何错误,即使它应该出现。只需打印“1”并返回。
在控制台中显示错误的唯一方法是放置
try:
...code...
except Exception as e:
print(e)
胜过一切。
如果我手动调用函数(而不是用 @bot.commands 等装饰它),它也会报告错误
我不知道..
webhook()
中未引发异常的原因是机器人不会自动为您引发任何异常。默认情况下,bot.process_new_updates()
将在内部使用工作线程来完成其工作,并且当工作线程遇到异常(例如在您的情况下)时,它只会存储异常信息而不传播它。然后由机器人用户检查并引发异常。
使用
polling
时看到异常的原因是因为它在内部检查并引发任何异常,而您没有也不应该在 webhook()
中执行此操作。
为了确保引发异常,您可以简单地让机器人运行而不使用工作线程。
bot = telebot.TeleBot(token, threaded=False)