discord.py QR Code Generator缺失参数报错处理
Discord.py 二维码生成命令参数校验问题修复
问题原因
你当前写的参数判断逻辑不会生效,核心原因是:当你把link定义为位置必填参数时,discord.py会在执行命令函数本体前,先完成参数解析步骤,如果用户没传这个参数,框架会直接抛出MissingRequiredArgument异常,根本不会进入你写的if link == ""判断分支。
另外你现有代码还存在两个额外bug:
- 错误提示分支里的
ctx.sent是拼写错误,正确的方法名是ctx.send - 如果触发空参数判断分支,
embedd变量从未被定义,函数执行到最后一行await ctx.send(embed=embedd)时会抛出变量未定义的错误
你当前编写的代码如下:
@client.command() async def qrcodecreator(ctx, link): if link == "": await ctx.sent("You did not add a link.") else: embedd = discord.Embed(title="This is the generated qr code.") embedd.set_image(url=f"https://api.qrserver.com/v1/create-qr-code/?size=450x450&data={link}") await ctx.send(embed=embedd)
未传参数时触发的框架异常:
Ignoring exception in command qrcodecreator: Traceback (most recent call last): File "/home/runner/BlissfulThirstyKilobyte/venv/lib/python3.8/site-packages/discord/ext/commands/bot.py", line 939, in invoke await ctx.command.invoke(ctx) File "/home/runner/BlissfulThirstyKilobyte/venv/lib/python3.8/site-packages/discord/ext/commands/core.py", line 855, in invoke await self.prepare(ctx) File "/home/runner/BlissfulThirstyKilobyte/venv/lib/python3.8/site-packages/discord/ext/commands/core.py", line 789, in prepare await self._parse_arguments(ctx) File "/home/runner/BlissfulThirstyKilobyte/venv/lib/python3.8/site-packages/discord/ext/commands/core.py", line 697, in _parse_arguments transformed = await self.transform(ctx, param) File "/home/runner/BlissfulThirstyKilobyte/venv/lib/python3.8/site-packages/discord/ext/commands/core.py", line 542, in transform raise MissingRequiredArgument(param) discord.ext.commands.errors.MissingRequiredArgument: link is a required argument that is missing.
修复方案
你可以任选以下一种方案实现友好的参数缺失提示:
方案1:给参数设置默认值,在命令内做校验
把link参数的默认值设为None,让框架在参数解析阶段不会因为缺失参数直接抛错,参数校验逻辑放在函数开头执行,校验不通过直接return终止后续逻辑,修正后的完整代码:
@client.command() async def qrcodecreator(ctx, link=None): if not link: await ctx.send("你未传入需要生成二维码的链接/文本,请补充参数后重试。") return embedd = discord.Embed(title="这是生成的二维码") embedd.set_image(url=f"https://api.qrserver.com/v1/create-qr-code/?size=450x450&data={link}") await ctx.send(embed=embedd)
方案2:全局捕获缺失参数异常统一处理
如果你有多个命令都需要做必填参数缺失提示,可以注册全局命令错误监听事件,统一捕获MissingRequiredArgument异常返回提示,不需要修改每个命令的参数定义:
@client.event async def on_command_error(ctx, error): if isinstance(error, commands.MissingRequiredArgument): await ctx.send(f"命令执行失败,缺失必填参数:`{error.param.name}`,请补充后重试。") return # 其他类型的命令错误可以在此处继续添加分支处理
使用这个方案时,你只需要修正原有命令里的拼写错误和变量作用域bug即可。
内容的提问来源于stack exchange,提问作者Ocryol
相关产品推荐
相关产品推荐

