Полезная ошибка указывает на программу, которую вы можете изменить.
Запустите три характерных примера с ошибками, один защищенный успешный запуск и одно длительное успешное вычисление через профиль Lispex SICP. Прочитайте статус среды выполнения, типизированный класс ошибки профиля, сообщение и трассу выполнения с фиксированным лимитом перед тем, как изменить совместимый со Scheme исходный код для получения желаемого поведения.
Можете ли вы связать сообщенный класс и сообщение с конкретным предположением в исходном коде?
- Отличие несвязанного имени от числовой ошибки
- Распознавание несоответствия области определения примитива
- Использование трассы для поиска вычислений, выполненных до сбоя
- Подтверждение того, что невыбранная ветвь не выполняет вычислений
- Отличие завершенного вычисления от усеченной трассы
Первая программа запрашивает связывание, отсутствующее в ее окружении. Вторая доходит до деления с нулевым делителем. Третья передает число туда, где car требуется объект-пара. Это разные предположения в исходном коде, и среда выполнения Lispex SICP сообщает о различных классах ошибок.
Четвертая программа содержит такое же некорректное деление, но выбирает другую ветвь if. Она возвращает 7, поскольку некорректное выражение не вычисляется. Изменяйте исходный код по одному элементу, запускайте снова и используйте новые наблюдения, чтобы определить, достигнуто ли желаемое поведение.
Пятая программа ведет обратный отсчет от 500 и завершается со значением 0, но ее трасса достигает лимита в 1024 события и усекается. Завершение вычисления и полнота трассы представляют собой раздельные наблюдения.
- Вывод
- —
- Значение
- —
- Диагностика
- —
Первые три программы сообщают unbound-variable с “unbound variable: missing”, numeric с “division by zero” и wrong-type/domain с “car: expected an object”. Защищенная программа завершается со значением 7 без ошибок профиля Lispex SICP. Длительная программа завершается со значением 0, при этом ее трасса сообщает truncated at limit.
Запуски с ошибками завершаются полными трассами выполнения с фиксированным лимитом после 3, 4 и 3 событий. Защищенный успешный запуск содержит 3 события и не применяет деление. Длительный успешный запуск сохраняет 1024 события и сообщает об усеченной трассе. В совокупности эти точные наблюдения служат руководством по исправлению предоставленных примеров.
Пять проверок для чтения диагностики
Каково минимальное исправление для несвязанного имени?
Ответ Определите missing или замените его именем, которое уже связано. Правильный выбор зависит от требуемого поведения программы, а не от стремления устранить ошибку любым способом.
Что необходимо изменить при числовой ошибке?
Ответ Вычисленный делитель не должен быть равен нулю. Защитная проверка может быть уместна, если ноль является допустимым входным значением, требующим отдельного поведения.
Что диагностика car сообщает о своем входном значении?
Ответ Вычисленный аргумент находится вне области определения примитива. Передача пары или выбор примитива для чисел исправляют разные варианты программы.
Почему пример с защитной проверкой не является скрытым сбоем?
Ответ Правило вычисления для if обращается только к выбранной ветви, поэтому выражение деления не выполняет вычислений в этом запуске.
Привела ли усеченная трасса к сбою длительной программы?
Ответ Нет. Вычислитель завершил работу со значением 0. Только учебная трасса прекратила запись при достижении лимита событий, поэтому последующие переходы не видны.