Почему я не могу найти ссылку ‘__traceback__’ в ‘None’?

#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) из примера.