Найдите полученный код, чтобы понять, что проверить дальше. Перед выбором обработчика исключений уточните этап возникновения ошибки.
Начните с кода
Это полное выражение вызывает ошибку во время выполнения.
(car 1)Код и сообщение
E310 · car: expected a pair, got 1Строка E310 ниже предлагает проверить аргумент car. Если передать пару, как в (car '(1 2)), результатом будет 1. Полный файл, команда и позиция ошибки разобраны в руководстве по диагностике.
Исправьте исходник до выполнения
На этих этапах обработчики ещё не запущены. Исправьте исходник и запустите его снова.
| Код | Этап | Что проверить |
|---|---|---|
| E100 | Чтение | Неверный токен или непарный разделитель, например пропущенную ) в (+ 1 2. |
| E110 | Нормализация | Связывание зарезервированного слова, например if. Выберите другое имя. |
| E120 | Чтение или нормализация | Запрещённое расширение или форму, например #; или define-syntax. |
| E130 | Нормализация | Обязательные части формы, например все три выражения в if. |
| E140 | Чтение | Структуру точечного списка: положение точки и значение после неё. |
| E150 | Чтение | Неверное экранирование в строке или символьный литерал. |
| E314 | Чтение | Литерал неточного числа, которое не является конечным, например 1e999. |
При чтении текст преобразуется в значения и формы. Нормализация проверяет структуру форм и преобразует сокращения в основные формы.
Исправьте или перехватите ошибку выполнения
Эти ошибки возникают, когда выполнение доходит до проблемной операции. Их можно обработать через guard: выбранная ветвь возвращает результат всего выражения guard.
| Код | Причина | Что проверить |
|---|---|---|
| E300 | Чтение несвязанного имени | Имя в указанной позиции исходника и его определение. |
| E301 | Вызов значения, которое не является процедурой | Значение на месте процедуры в вызове. |
| E302 | Неверное число аргументов | Параметры процедуры и число переданных аргументов. |
| E303 | set! для несвязанного имени | Было ли имя связано до присваивания. |
| E310 | Операция ожидала пару или подходящий список | Аргумент car, cdr или указанной процедуры для списков. |
| E311 | Индекс вне диапазона | Индекс и размер значения, к которому обращается программа. |
| E312 | Встроенная процедура получила неверный тип | Типы, которые принимает указанная процедура. |
| E313 | Деление на ноль | Делитель. |
| E314 | Неточный результат не является конечным | Арифметическую операцию и величину операндов. |
| E320 | Число возвращённых значений не подходит для этой позиции | Ожидает ли принимающее выражение одно значение или допускает несколько. |
| E321 | Чтение связывания letrec до инициализации | Ссылки на имена при вычислении начальных значений. |
| E340 | Продолжение выхода больше не активно | Было ли оно уже использовано или завершился ли создавший его вызов. |
E314 на этапе чтения не перехватывается. E314 от арифметической операции во время выполнения можно перехватить.
Продолжение выхода — это процедура, созданная call/cc для досрочного возврата из своего вызова. Её можно использовать только один раз, пока этот вызов активен.
Обработайте объект от raise или ошибку обработчика
| Код | Причина | Как обработать |
|---|---|---|
| E330 | (error message …) вызывает ошибку с объектом | guard получает объект. Прочитайте сообщение и приложенные к ошибке значения. |
| E331 | Переданный с ошибкой объект дошёл до верхнего уровня без обработки | Перехватите его через guard или обработчик. raise передаёт любое значение, поэтому перед чтением полей проверьте error-object?. |
| E332 | Обработчик нормально вернулся после ошибки, которая не допускает продолжения | Внешний обработчик может перехватить эту новую ошибку. Для выхода из ошибочного выражения используйте guard. Для продолжения с возвращённым значением используйте raise-continuable. |
Если ни одна ветвь guard не подошла и нет else, ошибка с исходным объектом передаётся дальше. raise-continuable возвращает результат обработчика в вызов, который передал ему условие. Оба способа показаны в руководстве по обработке ошибок.
Замените устаревающие имена
Предупреждения сохраняют порядок возникновения. Встроенная устаревающая процедура предупреждает один раз на место вызова, даже если затем операция завершится ошибкой. Связывание, перекрывающее это имя, не вызывает предупреждения об устаревшем имени.
| Код | Вызов с предупреждением | Имя для нового кода |
|---|---|---|
| W330 | % | modulo |
| W331 | list-first или list-rest | first или rest соответственно |
Отреагируйте на предел ресурсов
ResourceLimit обозначает ресурсный исход отдельно от перехватываемых ошибок E3xx. Нехвостовой вызов оставляет работу после возврата вызванной процедуры. Когда глубина таких вызовов достигает предела, нативная команда сообщает recursion-limit и завершается с кодом 2.
Уменьшите объём работы или пересмотрите объявленный профиль ресурсов. Обработчик исключений не может продолжить запуск, остановленный пределом ресурсов.