awesome-everything EN
↑ Обратно к восхождению

Базовый CS с нуля

Когда программа падает: чтение кода и trace

Суть Прочитай stack trace и короткие сниппеты, затем классифицируй каждый сбой: какая строка бросила, defined error это или undefined behaviour, и где живёт настоящая причина.
Высота — путь к senior
НольJuniorMiddleSenior
Ты на middle-высоте — в небе
◷ 14 min

Сбой читается в двух местах: код, который выполнился, и trace, который напечатал рантайм. Для каждого сниппета ниже делай то, что инженер делает первым — найди throw site, назови вид сбоя и реши, где живёт настоящая причина.

Цель

Потренируй цикл чтения, к которому вёл юнит: разбирай stack trace сверху вниз, чтобы найти throw site, классифицируй сбой как defined error или undefined behaviour и отделяй, где exception всплыл, от того, где реально сидит его причина.

Сниппет 1 — прочитай trace

Error: Cannot read properties of undefined (reading 'name')
    at formatLabel (render.ts:14)
    at renderRow (render.ts:31)
    at renderTable (render.ts:48)
    at main (app.ts:9)
Викторина

Читая этот trace сверху вниз, какое утверждение верно?

Сниппет 2 — классифицируй сбой

function loadUser(record) {
  return record.profile.name.toUpperCase();
}
loadUser({ profile: null });  // profile is null, not an object
Викторина

record.profile равен null, поэтому код читает .name у null. Какой это вид сбоя в JavaScript и как ты о нём узнаешь?

Сниппет 3 — выход за границы, два языка

prices = [10, 20, 30]   // valid indices 0, 1, 2
read prices[5]          // index 5 — two past the end
Викторина

Одно и то же чтение за границей выполняется в языке с проверкой границ и в низкоуровневом языке без проверки. Чем различаются исходы?

Сниппет 4 — throw site не есть причина

function parseAge(text) {
  const n = Number(text);
  if (Number.isNaN(n)) throw new Error("not a number: " + text);
  return n;
}

function loadProfile(raw) {
  return { age: parseAge(raw.age) };   // raw.age came from upstream
}
// raw.age is "thirty" — never validated before reaching here
Викторина

Trace упирается в parseAge ('not a number: thirty'). Гипотеза при debugging должна отделить, где exception всплыл, от того, где живёт причина. Какое прочтение верно?

Итог

Любой сбой читается в коде и trace: trace разбирается сверху вниз, верхняя строка — throw site, нижняя — лишь точка входа; чтение свойства у null — defined error, который громко поднимается, а непроверенное чтение за границей — undefined behaviour, молча возвращающее мусор; и throw site — где error всплыл, не всегда где живёт причина. Классифицируй сбой, найди, где он всплыл, затем рассуждай вниз по цепочке к шагу, который первым пошёл не так.

Продолжить восхождение ↑Когда программа падает: охота на два бага рассуждением
хоткеи развернуть
поиск
K
пред. пьеса
k
след. пьеса
j
тиры
t
это меню
?
sources3
expand
  1. 01
  2. 02
  3. 03

Trademarks belong to their respective owners. Editorial reference only.