Discord机器人开发:async/await模式下用户输入校验的错误处理问题
修复方案
核心问题点
- 数值范围判断逻辑完全错误,
value > 0 or value < 10的条件对所有整数都成立,会导致任意合法整数都被判定为无效 - 未对异步方法
ctx.reply()添加await调用,提示消息无法正常发送 - 裸写
except会捕获所有无关异常,不利于问题排查,同时未处理wait_for的超时异常 bot.wait_for放在try块外,超时异常无法被捕获会直接导致程序报错
修复后代码
while True: try: # 等待用户输入,超时时间150秒 input_msg = await bot.wait_for("message", check=check, timeout=150.0) value = int(input_msg.content) # 校验取值范围:此处以要求输入1-9之间的整数为例,可按需调整范围 if not (0 < value < 10): raise ValueError("数值超出合法范围") # 校验通过,跳出循环 break except ValueError: # 捕获整数转换失败、数值超出范围的异常,提示重新输入 await ctx.reply("输入不合法,请输入1-9之间的整数") except TimeoutError: # 捕获超时异常,终止本次输入流程 await ctx.reply("等待输入超时,本次操作已取消") break
修改说明
- 判断逻辑修正:将原有错误的范围判断替换为
not (0 < value < 10),仅当输入的整数不在1-9区间时才触发异常,符合取值校验需求 - 异步调用补全:为
ctx.reply()添加await关键字,确保提示消息能正常推送给用户 - 异常分类捕获:拆分捕获
ValueError和TimeoutError两类明确的异常,避免无关异常被吞噬 - 代码结构调整:将
bot.wait_for移入try块内,统一处理输入等待过程中的异常场景
内容的提问来源于stack exchange,提问作者Marc Alonso
相关产品推荐
相关产品推荐

