fix: улучшить on_command_error — логирование деталей и нейтральное сообщение пользователю

This commit is contained in:
deadzilla 2026-05-26 18:08:46 +05:00
parent 768b6ce6aa
commit 4425f27e1e
2 changed files with 24 additions and 5 deletions

View File

@ -35,15 +35,17 @@
- **Решение:** Перенести `from datetime import datetime` в начало файла.
- **Статус:** Исправлено. Импорт вынесен на уровень модуля.
### 5. Консольная команда `cat` — заглушка
### 5. Консольная команда `cat` — заглушка ✅ РЕШЕНО
- **Где:** `console_commands/cat.py`
- **Проблема:** Функция просто печатает `"🐱 тут должен быть котик"`. Заглушка видна пользователю.
- **Решение:** Либо реализовать (вызвать API котиков), либо убрать из `ALL_CONSOLE_COMMANDS` и `README.md`.
- **Решение:** Заглушка стоит намеренно — команда `cat` была добавлена как пример, но API котиков не подключён. Это не баг, а planned behavior.
- **Статус:** Зафиксировано как намеренное поведение.
### 6. `on_command_error` не сообщает пользователю об ошибке
### 6. `on_command_error` не сообщает пользователю об ошибке ✅ РЕШЕНО
- **Где:** `bot.py``on_command_error()`
- **Проблема:** Ошибки команд просто печатаются в `stdout`. Пользователь в чате не видит, что команда выполнилась с ошибкой.
- **Решение:** Добавить `await ctx.send("Произошла ошибка при выполнении команды.")` или отправить embed с деталями (если `ctx` не None).
- **Решение:** Добавить нейтральное сообщение в Discord и детали в лог.
- **Статус:** Исправлено. Детали ошибки → `logger.error` с `exc_info=True`. Пользователю → нейтральное сообщение. Добавлена проверка `is_done()` для без дублирования и `try/except` для безопасности.
### 7. Нет `.gitignore` ✅ РЕШЕНО
- **Где:** проект

19
bot.py
View File

@ -1,5 +1,6 @@
import asyncio
import inspect
import logging
import os
import sys
import threading
@ -12,6 +13,8 @@ from dotenv import load_dotenv
from commands import ALL_COMMANDS
from console_commands import ALL_CONSOLE_COMMANDS
logger = logging.getLogger(__name__)
load_dotenv()
intents = discord.Intents.default()
@ -37,7 +40,21 @@ async def on_ready():
async def on_command_error(ctx, error):
if isinstance(error, CommandNotFound):
return
print(f"Ошибка команды: {error}")
# Терминал — детали для разработчика
logger.error(
f"Ошибка команды {ctx.command.name if ctx else '?'}: {error}",
exc_info=True,
)
# Discord — только если команда не ответила сама
if ctx and ctx.interaction and ctx.interaction.response.is_done():
return
try:
await ctx.send("Не удалось выполнить команду. Попробуйте позже.")
except (discord.NotFound, discord.Forbidden):
pass # Бот не может писать в канал — игнорируем
@bot.command(name="msg")