Python Telegram Bot如何在MessageHandler中捕获非法手机号输入并提示错误
结论:你提到的try/except捕获ValueError的方案无法直接实现需求,原因如下:
你当前使用的Filters.regex是前置过滤规则,只有用户输入完全匹配正则表达式的消息才会触发get_telefono回调函数,不符合规则的消息会被该Handler直接忽略,根本不会进入回调执行逻辑,自然不存在可以被捕获的ValueError。
正确实现方案有两种可选:
方案1:新增兜底MessageHandler(推荐)
在同一个GET_TELEFONO状态的Handler列表末尾新增一个匹配所有消息的兜底Handler,所有没匹配上手机号正则的消息都会进入该回调返回错误提示。
代码示例:
GET_TELEFONO: [ MessageHandler(Filters.regex('^\+?1?\d{9,15}$'), get_telefono), # 兜底处理非法输入,注意必须放在正则Handler的后面 MessageHandler(Filters.all, handle_invalid_phone) ]
兜底回调函数示例:
def handle_invalid_phone(update, context): update.message.reply_text("你输入的手机号码格式非法,请输入9-15位数字的手机号,支持带+1前缀") # 保持当前状态,等待用户重新输入 return GET_TELEFONO
方案2:把校验逻辑放到回调内部
移除原Handler的正则过滤规则,在get_telefono内部自行做格式校验,这时候你可以选择用try/except捕获异常,不过直接判断匹配结果更简洁。
代码示例:
# 修改Handler配置,只匹配非命令的文本消息 GET_TELEFONO: [MessageHandler(Filters.text & ~Filters.command, get_telefono)]
回调内部校验逻辑:
import re PHONE_REGEX = re.compile(r'^\+?1?\d{9,15}$') def get_telefono(update, context): input_content = update.message.text.strip() # 直接校验格式,不需要额外抛异常 if not PHONE_REGEX.match(input_content): update.message.reply_text("手机号码格式错误,请重新输入") return GET_TELEFONO # 号码合法,后续正常业务逻辑 # ...
如果你非要用try/except的写法也可以实现,属于冗余写法,不推荐:
def get_telefono(update, context): input_content = update.message.text.strip() try: if not PHONE_REGEX.match(input_content): raise ValueError("格式不匹配") # 正常业务逻辑 except ValueError: update.message.reply_text("手机号码格式错误,请重新输入") return GET_TELEFONO
内容的提问来源于stack exchange,提问作者Jorge López
相关产品推荐
相关产品推荐

