使用 Discord API 处理错误 (on_error)

dnL*_*nLL 0 python discord

我从 Python 开始,目前正在使用 API 开发 Discord 机器人。到目前为止一切顺利,一切正常。现在,我希望在没有控制台的服务器上托管脚本,这意味着我希望输出进入文件而不是控制台。我目前有以下工作:

import discord
import logging

logging.basicConfig(filename='.\output.log', filemode='w', level=logging.INFO, format='%(asctime)s:%(levelname)s:%(message)s')

xzbot = discord.Client()

# logging when the bot starts
@xzbot.event
async def on_ready():
 logging.info('Logged in as ' + xzbot.user.name + ' (' + xzbot.user.id + ')\n')
Run Code Online (Sandbox Code Playgroud)

所以这段代码会将所有警告和信息放入output.log中。话虽如此,它不适用于 Discord.py 引发的异常,例如当机器人尝试在没有权限的情况下发送消息时“权限被拒绝”。

Discord API 中有一个内置函数可以处理这个问题:

discord.on_error(event, *args, **kwargs)
Run Code Online (Sandbox Code Playgroud)

所以我可以这样调用这个函数:

async def xzbot.on_error(event, *args, **kwargs):
 pass
Run Code Online (Sandbox Code Playgroud)

现在,我尝试使用event,*args或者做一些事情,**kwargs但我需要一些帮助才能以我可以使用 的格式获得它logging.warning()。我所能得到的只是objecta 的结果print(*args),而且我不知道如何正确格式化它。

小智 5

好的,这段代码将记录下来,并向导致错误的通道发送一条消息。

await xzbot.send_message如果您不希望它发送消息,可以将其删除。

import traceback
@xzbot.event
async def on_error(event, *args, **kwargs):
    message = args[0] #Gets the message object
    logging.warning(traceback.format_exc()) #logs the error
    await xzbot.send_message(message.channel, "You caused an error!") #send the message to the channel
Run Code Online (Sandbox Code Playgroud)

Traceback.format_exc() 格式化最后一个错误,因此它看起来像打印到控制台的正常错误。

这是有关回溯模块的信息。