--- url: /templates/advanced/errors.md description: >- Все коды ошибок и предупреждений шаблонного движка Astral Moderation — что означают и как исправить. --- # Ошибки

Ошибки бывают двух видов: ошибки проверки редактор показывает сразу, пока вы пишете, а ошибки выполнения случаются, когда бот выполняет шаблон в чате. У каждой ошибки есть код — по нему ее легко найти на этой странице.

## Ошибки проверки { #compile } Показываются в редакторе со строкой и столбцом. Пока ошибка не исправлена, бот не выполняет этот шаблон. | Код | Что значит | Как исправить | |---|---|---| | `unexpected_token` | В выражении что-то лишнее или не на своем месте | Проверьте кавычки (только прямые `'` и `"`), скобки и запятые рядом с указанным местом | | `unexpected_eof` | Шаблон закончился раньше, чем ожидалось | Скорее всего, не закрыт островок `}}`, `%}` или строка в кавычках | | `unclosed_tag` | Блочный тег не закрыт | Добавьте `{% endif %}`, `{% endfor %}`, `{% endmacro %}` и т. п. | | `unknown_tag` | Такого тега нет | Сверьтесь со [списком тегов](./tags) | | `mismatched_end_tag` | Закрывающий тег не от того блока | `{% if %}` закрывается `{% endif %}`, а не `{% endfor %}` | | `unknown_function` | Такой функции или макроса нет | Проверьте название в [справочнике функций](./functions) | | `bad_arguments` | Неверное число аргументов функции или неверный аргумент | Сверьтесь с описанием функции | | `keyword_as_identifier` | Ключевое слово использовано как имя переменной | Переименуйте: нельзя `{% set if = 1 %}` | | `invalid_assignment` | Присваивание не в ту сторону | Слева в `set` — имя переменной: `{% set x = 5 %}` | | `duplicate_macro` | Два макроса с одним именем | Переименуйте один из них | | `run_outside_action` | `run` вне действия пользовательской команды | `run` работает только в командах | | `run_target_not_found` | Действие с таким UUID не найдено в этой команде | Скопируйте UUID заново из меню «⋯» нужного действия | | `include_not_found` | Общего шаблона с таким именем нет | Проверьте имя во вкладке «Общие шаблоны» | | `unsupported_in_telegram` | Функция невозможна в Telegram | Например, смена ника или меню выбора участников | | `template_too_long` | Шаблон длиннее 16 КБ | Вынесите общие части в [общие шаблоны](../shared) | | `invalid_markup` | Неизвестный HTML-тег или незакрытая разметка | Проверьте теги по [каталогу](./rich) | ## Предупреждения { #warnings } Не мешают сохранению и работе, но стоит посмотреть. | Код | Что значит | |---|---| | `pipe_precedence` | `\|` внутри сравнения или арифметики без скобок — скорее всего, результат не тот. Пишите `(x \| length) < 10` | | `logic_precedence` | `and` и `or` вперемешку без скобок | | `unsupported_in_text_mode` | Блочная разметка в шаблоне с режимом Text — она будет [упрощена](./rich#text-mode) | | `markdown_context_escape` | `{{ }}` внутри строки таблицы или ссылки Markdown — используйте `table()` или `link()` | | `premium_required` | Кастомный эмодзи: сработает, только если у владельца бота Telegram Premium | | `non_https_media` | Медиа по ссылке `http://` — нужна `https://` | | `jb_underline_syntax` | `__текст__` в шаблоне: в Telegram это жирный, а не подчеркнутый | ## Ошибки выполнения { #runtime } Случаются в чате. Участник видит короткое сообщение, подробности — во вкладке [«Диагностика»](/commands/testing#diagnostics). | Код | Что случилось | Что делать | |---|---|---| | `quota_steps` | Слишком много шагов | Упростите шаблон, уменьшите циклы | | `quota_time` | Шаблон выполнялся дольше 50 мс | То же | | `quota_loops` | Циклы сделали больше 5 000 шагов или вложены глубже 3 | Обрабатывайте часть списка через `slice` | | `quota_storage` | Превышена квота атрибутов или индексов | См. [квоты](./limits#quotas) | | `quota_astral` | Больше 5 обращений к `astral` | Сохраняйте результаты в переменные | | `quota_messages` | Шаблон пытался отправить больше 3 сообщений | | | `quota_roles` | Больше 10 изменений ролей | | | `type_error` | Арифметика с нечисловым значением (строгий режим) | Проверяйте ввод через `is number` | | `undefined_variable` | Вывод несуществующей переменной (строгий режим) | Проверьте имя | | `unknown_property` | Несуществующее свойство (строгий режим) | Проверьте имя по справочнику типов | | `division_by_zero` | Деление на ноль | Проверьте делитель перед делением | | `immutable_list` | Попытка изменить список, который менять нельзя (диапазон или данные бота) | Создайте свой список: `{% set list = [] %}` и `addAll` | | `message_too_long` | Итоговое сообщение длиннее лимита | Сократите текст или используйте `slice` | | `rich_limit_exceeded` | Превышен лимит rich-сообщения: блоки, медиа, столбцы | См. [лимиты](./rich#limits) | | `media_send_failed` | Не удалось отправить медиа | Проверьте ссылку и право бота отправлять медиа | | `tier_forbidden` | Функция `astral` доступна только чатам, привязанным к клубу Astral | См. [уровни доступа](../astral#tiers) | | `astral_unavailable` | Данные Astral временно недоступны | Попробуйте позже | | `run_depth_exceeded` | Больше 3 переходов `run` | Упростите цепочку | | `include_repeated` | Один общий шаблон вставлен дважды | Каждый общий шаблон вставляется один раз | | `bot_lacks_right` | У бота нет нужного права в Telegram | Выдайте боту право в настройках чата; проверьте чек-лист на странице «Обзор» | ## Свои ошибки { #custom } Вы сами можете остановить шаблон с понятным сообщением: ```template {% require arguments.targetMember returning 'Ответь командой на сообщение участника' %} {% if arguments.get(2) > 1000 %}{% return 'Нельзя выдать больше 1000 за раз' %}{% endif %} ``` Как бот показывает такие сообщения — ответом, эфемерно или молча, — задается в [настройках модуля «Команды»](/commands/settings#error-mode).