Перейти к содержимому

Обработка ошибок (Error Handling)

В ZenithGram встроен мощный инструмент ErrorHandler, который полностью изолирован от основной логики бота. Это позволяет ловить ошибки даже тогда, когда сама библиотека не успела инициализироваться (например, при ошибках в composer.json или глобальных конфигах).

Как это работает?

ErrorHandler работает как отдельный сервис:

  1. Вы создаете его с токеном бота.
  2. Настраиваете (куда слать отчеты, как фильтровать пути).
  3. Вызываете register(), чтобы "взять под контроль" все ошибки PHP.

Быстрый старт

Рекомендуется инициализировать дебаггер в самом верху вашего главного файла (index.php или worker.php).

php
<?php
require_once __DIR__ . '/vendor/autoload.php';

use ZenithGram\ZenithGram\ErrorHandler;
use ZenithGram\ZenithGram\ZG;

// 1. Настройка
$debugger = (new ErrorHandler(BOT_TOKEN))
    ->setSendIds(123456789) // ID админа для логов
    ->shortTrace(true)      // Скрыть лишнее из vendor
    ->register();           // Включить глобально

// 2. Обычный запуск бота
$tg = ZG::create(BOT_TOKEN);
// Любая ошибка ниже будет поймана и отправлена админу автоматически

Использование с Long Polling

При использовании LongPoll дебаггер автоматически перехватывает ошибки внутри цикла обработки событий. Если в логике вашего бота (внутри func()) произойдет сбой, бот не "умрет", а просто отправит отчет и перейдет к следующему сообщению.

php
$lp = LongPoll::create(BOT_TOKEN);

// Конфигурируем дебаггер
(new ErrorHandler(BOT_TOKEN))
    ->setSendIds(123456789)
    ->register();

$lp->listen(function (ZG $tg) {
    $bot = new Bot($tg);
    // ... логика ...
});

Свой обработчик (setHandler)

Если вы хотите не просто получать сообщения, но и выполнять свою логику (например, записывать в файл или уведомлять внешнюю систему мониторинга):

php
$debugger->setHandler(function (ZG $tg, Throwable $e) {
    // Сообщение пользователю
    $tg->reply("⚠️ Извините, на сервере произошла ошибка.");
    
    // Запись в системный лог
    MyLogger::error($e->getMessage());
});

Контекст в кастомном хендлере

Если ошибка произошла во время обработки апдейта, объект $tg будет содержать данные пользователя (вы сможете сделать reply). Если ошибка глобальная (например, упал сам скрипт), объект $tg будет "пустым", но через него всё равно можно будет отправлять сообщения в API, используя явные ID чатов.

Скриншоты отчетов

В Telegram (HTML-форматирование)

telegram.png

В Терминале (CLI-раскраска)

terminal.png

Опубликовано под лицензией MIT.