Справочное приложение
Диагностика
Раздел диагностики объясняет сообщения о проблемах в исходной программе и во время выполнения. Каждое сообщение содержит код, описание и доступные сведения о месте ошибки.
Когда возникает сообщение
Сначала проверяется исходный текст: допустимые символы, запись литералов и структура конструкций. Затем проверяются имена, типы и контекст использования. Ошибки этих этапов препятствуют запуску.
Во время исполнения могут возникнуть ошибки, которые зависят от данных: деление на ноль, выход индекса за границы, недопустимый ввод или отказ файловой операции. Их можно обрабатывать средствами TRY, когда ошибка относится к поддержанному договору языка.
Код и место ошибки
Код позволяет найти точное условие в справочнике. Диапазон исходного текста указывает место, которое нужно проверить. Одна ошибочная запись может вызвать несколько связанных сообщений; исправляйте исходную причину и выполняйте проверку снова.
Префиксы MB0xxx, MB1xxx, MB2xxx и MB3xxx относятся соответственно к чтению текста, разбору, смысловой проверке и выполнению. Служебные сообщения инфраструктуры не расширяют пользовательский синтаксис.
Коды диагностики
Ошибки чтения и разбора
| Код | Когда возникает |
|---|---|
MB0001 | При чтении текста программы встречен символ, который не используется в языке Axiom. |
MB0002 | Строковый литерал не закрыт кавычкой до конца строки; то же правило действует для интерполированной строки $"...". |
MB0003 | Числовой литерал содержит недопустимый символ или имеет формат, который не соответствует ни одному поддерживаемому числовому типу. |
MB0004 | Числовой литерал выходит за допустимый диапазон своего типа: не помещается в LONG или выходит за диапазон конечных значений DOUBLE. |
MB1001 | В записи конструкции не хватает ожидаемого ключевого слова или знака. |
MB1002 | На месте имени переменной, процедуры или функции ожидается идентификатор. |
MB1003 | На месте выражения конструкция не содержит допустимого выражения. |
MB1004 | Встречен токен, который не допускается в текущем месте конструкции. |
MB1005 | В конструкции IF допускается только один блок ELSE. |
MB1006 | В конструкции SELECT CASE допускается только один блок CASE ELSE. |
Смысловые ошибки
| Код | Когда возникает |
|---|---|
MB2001 | Используется имя, которое не объявлено или уже вышло из области видимости. Если имя — CALL, к тексту добавляется подсказка: в Axiom нет оператора CALL, процедура вызывается просто как Foo(). |
MB2002 | Имя переменной, константы, процедуры или функции объявлено повторно в одной области видимости. |
MB2003 | Используется значение несовместимого типа. В том числе этот код появляется, когда переменной-массиву пытаются присвоить скаляр или когда скалярной переменной пытаются присвоить массив. Если имя одновременно обозначает переменную и функцию, к тексту добавляется подсказка про ссылку на функцию. |
MB2004 | Функция вызвана с неверным числом аргументов. |
MB2005 | Имя используется как вызываемое, но не объявлено ни как функция, ни как процедура. |
MB2006 | В SUB используется RETURN со значением. |
MB2007 | В FUNCTION используется RETURN без выражения. |
MB2008 | В условии используется выражение, которое не имеет тип BOOLEAN. |
MB2009 | Счётчик FOR имеет неподдерживаемый тип (например STRING), либо занявшее имя принадлежит переменной неподходящего типа. Счётчик FOR всегда локальный. |
MB2010 | Выполняется присваивание константе. |
MB2011 | Оператор ERASE или REDIM применён к имени, которое не является массивом. |
MB2012 | RETURN используется вне SUB или FUNCTION. |
MB2013 | EXIT FOR используется вне ближайшего цикла FOR ... NEXT. |
MB2014 | EXIT DO используется вне цикла DO ... LOOP. |
MB2015 | В конструкции SELECT CASE диапазон или значение CASE указано неверно. |
MB2016 | Новое имя затеняет уже существующее имя во внешней области видимости или в заголовке FOR. Для счётчика FOR это означает: имя уже занято (DIM, CONST, параметр, внешний цикл), а счётчик FOR всегда локальный — удалите объявление или переименуйте. |
MB2017 | Группа в DIM не содержит ни явного типа, ни инициализатора для вывода типа. |
MB2018 | Константное числовое значение не помещается в явно указанный целевой числовой тип. |
MB2019 | Процедура SUB используется как значение в выражении. |
MB2020 | Значение используется как вызываемое, но его тип не является функциональным. |
MB2021 | Тип после AS не объявлен. |
MB2022 | Поле внутри TYPE имеет неподдерживаемую форму или пользовательские типы образуют цикл вложенности. |
MB2023 | В пользовательском типе отсутствует поле, к которому обращается программа. Если поле похоже на одно из существующих, к тексту добавляется подсказка «Возможно, вы имели в виду поле …». |
MB2024 | Доступ через точку применён к значению, которое не является пользовательским TYPE. |
MB2025 | Оператор ERASE или REDIM применён к фиксированному массивному полю записи TYPE. |
MB2026 | Объявление фиксированной строки STRING * N указано с недопустимой длиной или в неподдерживаемом контексте. |
MB2027 | Поле пользовательского типа TYPE имеет значение по умолчанию, которое несовместимо с типом поля. |
MB2028 | Аргумент, передаваемый параметру BYREF, не является простой переменной подходящего типа. |
MB2029 | Функция с параметром BYREF используется как функциональное значение. |
MB2031 | В литеральной форме создания записи TypeName(...) смешаны именованные и позиционные аргументы. |
MB2032 | Позиционная форма TypeName(...) получила неверное число аргументов. |
MB2033 | Вызов конструктора или перегруженного метода записи TYPE оказался неоднозначным. |
MB2034 | Обработчик оператора ON KEY не является подходящей процедурой SUB. |
MB2035 | Обработчик оператора ON MOUSE не является подходящей процедурой SUB. |
MB2036 | В операторе ON MOUSE указано недопустимое имя события мыши. |
MB2037 | CONTINUE FOR используется вне цикла FOR ... NEXT. |
MB2038 | CONTINUE WHILE используется вне цикла WHILE ... END WHILE. |
MB2039 | CONTINUE DO используется вне цикла DO ... LOOP. |
MB2040 | Оператор-выражение не содержит вызова процедуры или функции и не имеет эффекта. Если требовался вызов, укажите скобки, например FLUSH(f). |
MB2044 | Внутри метода TYPE используется голое имя поля. Поле доступно только через SELF: напишите SELF.ИмяПоля. |
MB2045 | Предупреждение: имя используется и как переменная, и как процедура (SUB/FUNCTION). Это не ошибка — разные классы имён могут совпадать, — но компилятор советует проверить, не опечатка ли это. |
MB2046 | Графическая операция находится в заведомо неподходящем режиме: графическая поверхность ещё не создана, выбран текстовый SCREEN 0 или оператору требуется CANVAS, а выбран SCREEN (либо наоборот). Компилятор учитывает порядок операторов, константные номера режимов, ветви и прямые вызовы процедур. Ошибка блокирует запуск. |
MB2049 | Модуль IMPORT отсутствует в составе программы или не найден в папке точки входа. Проверьте имя модуля и наличие файла .axm. Отказ чтения найденной зависимости в CLI отличается от отсутствующего модуля и описан кодом MB4004. |
MB2050 | Несколько исходных документов задают одинаковое имя модуля. |
MB2051 | В явно переданном наборе модулей отсутствует точка входа. |
MB2052 | Обнаружен цикл IMPORT, в том числе импорт файлом самого себя. Запрет действует и для модулей без исполняемых инструкций. |
MB2053 | Другой модуль обращается к закрытому имени объявления. PRIVATE ограничивает имя, а не поля уже полученной записи. |
MB2054 | Несколько импортов предоставляют одно и то же открытое имя. |
MB2055 | Импортированное имя конфликтует с другим доступным объявлением. Правила IMPORT. |
MB2048 | Имя после NEXT не совпадает со счётчиком закрываемого FOR. Имя можно опустить; если оно указано, оно должно совпадать без учёта регистра. Для вложенных циклов проверяется ближайший открытый FOR. Правила FOR … NEXT. |
MB2047 | Переменная объявлена, но её значение нигде не читается. В Electron IDE сообщение отображается как совет с мягким выделением имени переменной, а не оператора DIM; в панели сообщений советы отделены от ошибок и предупреждений. Одно присваивание или ввод через INPUT не считается использованием результата. Проверьте имя переменной; используйте значение либо уберите ненужную переменную, сохранив необходимые действия её инициализатора. При правке устаревший совет сразу снимается и уточняется новым анализом. Совет не блокирует запуск; в модели диагностики компилятора сохраняется уровень предупреждения. Запускаемый пример. |
Ошибки загрузки зависимостей
| Код | Когда возникает |
|---|---|
MB4004 | CLI не смог прочитать зависимость точки входа из-за отказа файловой системы. Команды check и run завершаются с кодом 2. Команда check --json по-прежнему выдаёт JSON с диагностикой MB4004; сообщение о причине отказа также выводится в стандартный поток ошибок. Если модуль не найден, применяется MB2049. |
Ошибки во время выполнения
| Код | Когда возникает |
|---|---|
MB3001 | Во время вычисления произошло деление на ноль. |
MB3002 | Выполнено обращение к элементу массива вне допустимых границ. |
MB3003 | INPUT не смог преобразовать введённое значение или получил неверное число значений. |
MB3004 | Цикл FOR запущен со значением STEP 0. |
MB3005 | Во время выполнения потребовалось состояние, которое ещё не создано, например обращение к динамическому массиву до его выделения. |
MB3006 | FUNCTION завершилась по выполненной ветви без возвращаемого значения. |
MB3007 | Во встроенной функции или операции получено недопустимое фактическое значение, например аргумент вне допустимой области. Код также означает превышение предела строкового значения в 16 777 216 единиц UTF-16. |
MB3008 | Во время выполнения произошло числовое переполнение или получен недопустимый неконечный результат. |
MB3009 | Значение функционального типа не содержит функции и не может быть вызвано. |
MB3010 | При выполнении графической операции не оказалось подходящего активного SCREEN или CANVAS. Эта защита нужна, когда режим зависит от данных и компилятор не может заранее установить состояние. Заведомо неподходящий режим обнаруживается раньше через MB2046. |
MB3011 | Превышена максимальная глубина стека вызовов. Возможно, программа содержит бесконечную рекурсию. |
MB3012 | Математическая операция не определена для указанных значений: оператор ^ нельзя применять к отрицательному основанию с нецелой степенью. |
MB3013 | Не удалось выделить массив: превышен предел 67 108 864 элементов, произошло переполнение произведения длин измерений или не хватило памяти. Ошибку можно перехватить оператором TRY. Подробности приведены в разделе ошибок массивов. |
MB3014 | Программа читает или изменяет устаревшее представление массива после изменения формы корневого массива, например операторами REDIM или ERASE. Создайте представление заново. Ошибку можно перехватить оператором TRY. Подробности приведены в разделе ошибок массивов. |
Если ошибка возникла внутри локальной процедуры или функции, в тексте диагностики появится блок Цепочка вызовов с перечнем активных вызовов, их местами вызова и внешней процедурой или функцией, где объявлена локальная.
Запускаемые примеры
Откройте нужный файл в IDE и запустите его. Примеры с ошибкой предназначены для проверки сообщения компилятора или выполнения.
- Необъявленное имя
- Объявление DIM без типа и инициализатора
- Условие IF без логического значения
- Неверное число аргументов
- Деление на ноль
- Цикл FOR со STEP 0
- Неверное преобразование INPUT
- Литерал вне диапазона LONG
- Константа не помещается в DECIMAL
- Неконечный результат DOUBLE
- Недопустимое значение для LOG
- Ошибка внутри локальной функции с цепочкой вызовов