Skip to content

onError (Обработка ошибок)

Бывает, что в middleware возникают ошибки, и нам нужно их обрабатывать. Для этого был создан хук onError.

ts

bot
.
on
("message", () => {
bot
.
api
.
sendMessage
({
chat_id
: "@not_found",
text
: "Чат не существует....",
}); });
bot
.
onError
(({
context
,
kind
,
error
}) => {
if (
context
.
is
("message")) return
context
.
send
(`${
kind
}: ${
error
.
message
}`);
});

Добавление хука только для определенных контекстов

ts
bot.onError("message", ({ context, kind, error }) => {
    return context.send(`${kind}: ${error.message}`);
});
// или массив
bot.onError(["message", "message_reaction"], ({ context, kind, error }) => {
    return context.send(`${kind}: ${error.message}`);
});

Типы ошибок

Пользовательские

Вы можете отловить ошибку определенного класса, унаследованного от Error.

ts
export class NoRights extends Error {
    needRole: "admin" | "moderator";

    constructor(role: "admin" | "moderator") {
        super();
        this.needRole = role;
    }
}

const bot = new Bot(process.env.BOT_TOKEN as string)
    .error("NO_RIGHTS", NoRights)
    .onError("message", ({ context, kind, error }) => {
        if (kind === "NO_RIGHTS")
            return context.send(
                format`У вас недостаточно прав! Вам нужно иметь роль «${bold(
                    error.needRole
                )}».`
            );
    });

bot.on("message", (context) => {
    if (context.text === "ban") throw new NoRights("admin");
});

IMPORTANT

Мы рекомендуем следовать соглашению и называть типы ошибок в формате SCREAMING_SNAKE_CASE

Telegram

Эта ошибка является результатом неудачного запроса к Telegram Bot API.

ts
bot
.
onError
(({
context
,
kind
,
error
}) => {
if (
kind
=== "TELEGRAM" &&
error
.
method
=== "sendMessage") {
error
.
params
; // это параметры sendMessage
} });

Unknown

Эта ошибка - любая неизвестная ошибка, будь то ваш класс или просто Error.

ts
bot
.
onError
(({
context
,
kind
,
error
}) => {
if (
kind
=== "UNKNOWN") {
console
.
log
(
error
.
message
);
} });