Базовый CS с нуля
Когда программа падает: тест с выбором ответа
Шесть вопросов поперёк всего юнита. Каждый — небольшое решение, которое ты принимаешь перед реальным сбоем: не определение для заучивания, а различение, которое надо держать твёрдо — условие против механизма, громкий сбой против тихого, рассуждение против угадывания.
Убедись, что связываешь четыре урока в одну картину: error — это условие, exception — механизм, раскручивающий стек, stack trace — снимок этой раскрутки, undefined behaviour — опасный тихий случай, а debugging — рассуждение над детерминированной машиной.
Программа пытается открыть несуществующий файл. Что здесь error, а что exception?
main вызывает a, a вызывает b, b поднимает exception. Обработчик есть только у main. Сколько фреймов снимет (pop) рантайм и где возобновится нормальный поток?
Stack trace из четырёх строк (сверху вниз): divide, getAge, loadUser, main. Новичок первым делом правит main. Почему это неверный инстинкт?
Одна программа читает индекс 5 массива из 3 элементов и поднимает exception 'index out of range'. Другая читает ту же ячейку за границей и возвращает лежащие там биты, без всякой ошибки. Какой сбой опаснее и почему?
В JavaScript чтение индекса 9 массива из 3 элементов даёт undefined (не падение), и затем код вычисляет undefined + 1. Что происходит и почему это напоминает undefined behaviour, хотя каждый шаг определён?
Программа возвращает неверную сумму. Инженер начинает переворачивать сравнения и перезапускать, пока число не станет похожим на верное. В чём принципиальное возражение, опирающееся на работу машины?
Юнит — одна цепочка: error — условие, exception — механизм, который останавливает нормальный поток и раскручивает стек фрейм за фреймом в поиске обработчика, а stack trace — этот стек, замороженный в момент throw, читаемый сверху вниз, throw site первым. Undefined behaviour — опасный случай, где error не поднимается вовсе и мусорное значение едет молча. А поскольку машина детерминирована, ответ на любой сбой — рассуждение, а не угадывание: сформулируй проверяемую гипотезу, сузь диапазон, прочитай trace, проверь состояние, затем чини шаг, виновность которого доказал.