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

discord.py中on_message事件内return无法正常终止执行如何解决?

问题原因

return语句本身不存在语法问题,"失效"是对discord.py事件机制的认知偏差+代码逻辑漏洞共同导致的:

  • discord.py采用多监听器独立触发的事件分发规则:单个Cog内on_message函数的return,仅能终止当前Cog下该监听器的后续执行,无法拦截主文件全局on_message、其他Cog注册的on_message、框架内置的命令匹配与执行逻辑。如果观察到命令仍响应、其他模块的消息逻辑继续运行,属于框架的正常运行表现。
  • 现有代码缺少前置校验:仅服务器文字频道(TextChannel)存在topic属性,私信、语音频道、舞台频道等场景下访问message.channel.topic会直接抛出AttributeError,可能出现分支看似命中、实际return语句未执行的情况;若后续处理逻辑写在其他监听器中,当前函数的return自然无法生效。
修改方案

根据需要的拦截范围对应调整即可:

仅拦截当前Cog内的后续消息处理逻辑

补全频道类型校验,避免异常打断逻辑流,参考代码如下:

import discord
from discord.ext import commands

@commands.Cog.listener()
async def on_message(self, message):
    # 过滤机器人自身发送的消息,避免循环触发
    if message.author.bot:
        return
    
    # 仅服务器文字频道需要检查停用标识
    if isinstance(message.channel, discord.TextChannel):
        channel_topic = message.channel.topic or ""
        if "[SSbot deactivation]" in channel_topic:
            print(message.channel.name)
            # 此处return会直接终止当前Cog内on_message的后续代码
            return
    
    # 当前Cog的其他消息处理逻辑写在此处

命中停用分支后,当前Cog内上述位置之后的逻辑将不会执行。

全局拦截所有消息处理(含其他Cog逻辑、命令响应)

discord.py不支持单个监听器终止全局事件分发,需要做两处调整:

  • 将频道停用判断移到所有消息处理逻辑的最前端,尤其是主文件中await bot.process_commands(message)调用之前,命中停用标识直接return,不要执行命令处理逻辑
  • 若多个Cog都存在on_message监听器,可将停用判断封装为公共工具函数,每个监听器开头先调用校验,命中即return当前函数。

内容的提问来源于stack exchange,提问作者joonhwan1

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 10:36:18