Ошибка выполнения не отображается при использовании asyncio для запуска бота разногласий

Я разрабатываю бота для разногласий с помощью discord.py==2.1.0.

Я использую cog для написания основной функции, которую я хочу использовать, но я обнаружил, что когда весь бот обернут асинхронной функцией и вызывается asyncio.run(), мой терминал не будет отображать никаких сообщений об ошибках, когда в моем скрипте cog есть какая-либо ошибка времени выполнения.

Вот пример приложения. Я сохранил свой токен бота в переменной среды.

  • bot.py
import os
import discord
from discord.ext import commands
import asyncio

token = os.environ["BOT_TOKEN"]

class Bot(commands.Bot):
    def __init__(self):
        intents = discord.Intents.default()
        intents.members = True
        intents.message_content = True
        
        description = "bot example."

        super().__init__(
            command_prefix=commands.when_mentioned_or('!'), 
            intents=intents,
            description=description
        )

    async def on_ready(self):
        print(f'Logged in as {self.user} (ID: {self.user.id})')
        print('------')

bot = Bot()

async def load_extensions():
    for f in os.listdir("./cogs"):
        if f.endswith(".py"):
            await bot.load_extension("cogs." + f[:-3])

async def main():
    async with bot:
        await load_extensions()
        await bot.start(token)

asyncio.run(main())
  • ./cogs/my_cog.py
from discord.ext import commands

class Test(commands.Cog):
    def __init__(self, client):
        self.client = client

    @commands.Cog.listener()
    async def on_ready(self):
        print("Ready")
    
    @commands.command()
    async def command(self, ctx):
        test_error_message()   # An runtime error example
        print("Command")

async def setup(client):
    await client.add_cog(Test(client))
  • Команда, которую я запускаю в терминале, чтобы запустить бота.
python bot.py
  • Когда я набираю !command в канале разногласий, в терминале не отображается сообщение об ошибке, но не распечатывается «Команда», поэтому я уверен, что код остановился на строке, которую я вызвал test_error_message()
  • Я ожидал, что он должен нормально отображать сообщение об ошибке, но я не могу найти полезную ссылку, чтобы заставить его работать :(
  • Есть одна причина, по которой мне нужно использовать asyncio, у меня есть цикл задач для запуска в боте, как код ниже.
from discord.ext import tasks

@tasks.loop(seconds=10)
async def avatar_update():
    # code here

async def main():
    async with bot:
        avatar_update.start()
        await load_extensions()
        await bot.start(token)

  • Я был бы рад узнать, есть ли отличная практика для обработки ошибок в этой ситуации.

Спасибо!

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
101
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Client.start() не настраивает ведение журнала, поэтому, если вы хотите его использовать, вам нужно сделать это самостоятельно (есть setup_logging, чтобы добавить базовую конфигурацию). run() настраивает ведение журнала для вас.

Для получения дополнительной информации прочитайте документы. https://discordpy.readthedocs.io/en/stable/logging.html?highlight=logging

Я следил за документом о ведении журнала, добавил строку discord.utils.setup_logging() решил проблему! Кстати, я запускаю bot.run() в асинхронном цикле событий, я получаю ошибку времени выполнения, потому что asyncio.run(runner()) вызывается, поэтому я выбираю другой путь. Спасибо за столь быстрый ответ!

Allen Shen 27.11.2022 18:35

Да, run() уже вызывает это, поэтому вы не можете. Если вы используете run() и хотите выполнить асинхронную настройку, вы можете использовать setup_hook.

stijndcl 27.11.2022 20:33

Другие вопросы по теме