You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 02:27:17