#python #python-3.x #error-handling #discord.py #traceback
Вопрос:
У меня есть вопрос, который очень странный в моем случае. Я использую python3.9 и discord.py v1.7.3. Я хочу использовать on_command_error
пример отсюда, но, к сожалению, последняя строка не работает. В pycharm я получаю Cannot find reference '__traceback__' in 'None'
, и если я все равно попытаюсь просто запустить код, он правильно выведет его на консоль моего бота discord, но если я попытаюсь напечатать последнюю строку на канал discord, он отправит строку None
. Я много искал и спрашивал на официальном discord.py сервер поддержки, но никто не мог дать мне ответа.
Это весь мой винтик:
import sys
import traceback
import discord
from discord.ext import commands
from datetime import datetime
class ErrorHandler(commands.Cog):
def __init__(self, client):
self.client = client
@commands.Cog.listener()
async def on_command_error(self, ctx, error):
# This prevents any commands with local handlers being handled here in on_command_error.
if hasattr(ctx.command, 'on_error'):
return
# This prevents any cogs with an overwritten cog_command_error being handled here.
cog = ctx.cog
if cog:
if cog._get_overridden_method(cog.cog_command_error) is not None:
return
ignored = (commands.CommandNotFound,)
# Allows us to check for original exceptions raised and sent to CommandInvokeError.
# If nothing is found. We keep the exception passed to on_command_error.
error = getattr(error, 'original', error)
# Anything in ignored will return and prevent anything happening.
if isinstance(error, ignored):
return
if isinstance(error, commands.DisabledCommand):
await ctx.send(f'{ctx.command} has been disabled.')
elif isinstance(error, commands.NoPrivateMessage):
try:
await ctx.author.send(f'{ctx.command} can not be used in Private Messages.')
except discord.HTTPException:
pass
# For this error example we check to see where it came from...
elif isinstance(error, commands.BadArgument):
if ctx.command.qualified_name == 'tag list': # Check if the command being invoked is 'tag list'
await ctx.send('I could not find that member. Please try again.')
else:
# All other Errors not returned come here. And we can just print the default TraceBack.
traceback1 = traceback.print_exception(type(error), error, error.__traceback__, file=sys.stderr)
error_channel = self.client.get_channel(123456789)
await error_channel.send(traceback1)
traceback.print_exception(type(error), error, error.__traceback__, file=sys.stderr)
def setup(client):
client.add_cog(ErrorHandler(client))
Пример обратного отслеживания с консоли:
Traceback (most recent call last):
File "/usr/local/lib/python3.9/site-packages/discord_slash/client.py", line 1352, in invoke_command
await func.invoke(ctx, **args)
File "/usr/local/lib/python3.9/site-packages/discord_slash/model.py", line 209, in invoke
return await self.func(self.cog, *args, **kwargs)
File "/Bots/gift-bot/cogs/stats_commands.py", line 1412, in leaderboard_slash
await self.leaderboard_def(ctx, typ)
File "/Bots/gift-bot/cogs/stats_commands.py", line 539, in leaderboard_def
await msg.edit(embed=win_embed, components=None)
AttributeError: 'NoneType' object has no attribute 'edit'
Комментарии:
1. Можете ли вы предоставить нам обратную трассировку и что вы делаете, когда происходит фактическая ошибка? Похоже, что у вас нет ошибки, и вы пытаетесь получить обратную трассировку, но не можете сказать без дополнительной информации.
2. Теперь, когда вы отредактировали его, насколько я могу судить, ошибка не имеет ничего общего с кодом, который вы написали в сообщении, может быть, все правильно, и у другой части бота возникли проблемы? Может быть, другой человек видит проблему и может вам помочь, надеюсь, вам удастся ее исправить.
3. это относится друг к другу. У меня просто нет строки
print('Ignoring exception in command {}:'.format(ctx.command), file=sys.stderr)
из примера.