$ sudo teach IT
МОДУЛЬ 2 · УРОК 6

Ошибки и отладка (Debugging)

Ошибки — неотъемлемая часть программирования. Даже опытные разработчики ежедневно сталкиваются с ошибками. Важно не бояться их, а уметь читать, понимать и исправлять. Этому уроку стоит уделить особое внимание.

⏱ ~20 минут 🎓 Для новичков ⚡ JavaScript

🧘 Ошибки — это нормально

Прежде чем погрузиться в технику, давайте поговорим о психологии. Многие начинающие программисты пугаются ошибок. Увидел красную надпись в консоли — значит, что-то пошло не так, значит я плохой программист. Это неправильная установка.

На самом деле ошибки — это помощники. JavaScript не просто говорит «что-то не так» — он точно указывает, что именно пошло не так и где. Сообщение об ошибке — это не приговор, это подсказка.

«Программирование — это не написание кода без ошибок. Программирование — это процесс написания кода, получения ошибок и их исправления. Снова и снова.»

Даже у Линуса Торвальдса (создатель Linux), у команды Google, у разработчиков вашего браузера — у всех бывают баги. Это часть профессии. Разница между новичком и профи — не в отсутствии ошибок, а в скорости их нахождения и исправления.

🗂️ Три главных типа ошибок JavaScript

JavaScript имеет несколько типов встроенных ошибок. Три из них встречаются чаще всего — выучите их, и вы сразу будете понимать 90% сообщений в консоли.

🔤
SyntaxError — синтаксическая ошибка

Вы нарушили правила синтаксиса языка — написали код, который JavaScript не может понять. Как грамматическая ошибка в русском языке. Программа не запустится вообще — даже первая строка не выполнится.

// SyntaxError: Missing ) after argument list
console.log("Привет"    // забыли закрывающую скобку

// SyntaxError: Unexpected token
let x = ;               // нет значения после =

// SyntaxError: Unexpected end of input
function foo() {        // не закрыли фигурную скобку
  return 42;

Как исправить: читайте сообщение ошибки — там обычно написано, чего именно не хватает. Проверьте закрывающие скобки, кавычки, фигурные скобки.

🔍
ReferenceError — ссылка на несуществующее

Вы пытаетесь использовать переменную или функцию, которая не существует в данной области видимости. JavaScript ищет имя и не находит его.

// ReferenceError: userName is not defined
console.log(userName);  // переменная не объявлена!

// Частая причина — опечатка в имени:
let username = "Иван";
console.log(userName);  // u и U — разные! ReferenceError

// Использование переменной вне её области видимости:
function foo() {
  let secret = 42;
}
console.log(secret);  // ReferenceError — secret живёт только внутри foo

Как исправить: проверьте, объявлена ли переменная. Проверьте опечатки в имени (регистр, лишние/отсутствующие буквы). Проверьте область видимости.

🔧
TypeError — неправильный тип

Вы пытаетесь сделать операцию с данными неправильного типа: вызвать не-функцию, обратиться к свойству null/undefined, присвоить константе. Самая распространённая ошибка в JavaScript.

// TypeError: Cannot read properties of undefined (reading 'name')
let user = undefined;
console.log(user.name);   // нельзя читать свойство у undefined!

// TypeError: null is not iterable
let list = null;
for (let item of list) {} // нельзя итерировать null

// TypeError: sayHello is not a function
let sayHello = "Привет";
sayHello();               // строка — не функция!

// TypeError: Assignment to constant variable.
const PI = 3.14;
PI = 3;                   // нельзя изменить const

Как исправить: прочитайте сообщение — там написано, что именно пошло не так. Проверьте тип значения (console.log(typeof x)). Частый случай: обращение к свойству null/undefined — добавьте проверку.

🔎 Как читать сообщение об ошибке

Сообщение об ошибке содержит всю нужную информацию. Нужно просто научиться его читать. Вот типичное сообщение в консоли браузера:

TypeError: Cannot read properties of null (reading 'name')
at getUserName (script.js:15:20)
at main (script.js:28:5)
Тип ошибки

TypeError — тип ошибки. Сразу говорит о категории проблемы.

Описание

Cannot read properties of null (reading 'name') — что именно не так.

Стек вызовов

script.js:15:20 — файл, строка 15, столбец 20. Идите именно туда!

💡 Главное правило: читайте ошибку слева направо, сверху вниз. Первая строка — что случилось. Строки ниже (стек вызовов) — где именно произошло. Нажмите на ссылку с файлом и строкой — браузер откроет нужное место.

🖥️ Инструменты отладки: console

Объект console — ваш главный инструмент отладки. Это как разговор с программой: вы просите её рассказать, что в ней происходит.

console.log() — вывести значение

Самый используемый метод. Выводит значения в консоль браузера (открывается по F12 → Console). Можно передать несколько аргументов через запятую.

let x = 42;
let name = "Иван";
let arr = [1, 2, 3];

console.log(x);              // 42
console.log("x =", x);      // x = 42 (удобно — видно имя)
console.log(name, x);       // Иван 42
console.log("массив:", arr); // массив: [1, 2, 3]

// Лайфхак — вывести переменную с именем через объект:
console.log({ x, name });   // {x: 42, name: "Иван"}

console.error() и console.warn()

Вывести сообщение об ошибке (красным) или предупреждение (оранжевым) в консоль. Удобно для логирования проблем в вашем коде.

console.error("Что-то пошло не так!");   // красная надпись в консоли
console.warn("Это устаревший метод");    // оранжевая надпись

// Пример использования:
function divide(a, b) {
  if (b === 0) {
    console.error("Ошибка: деление на ноль!");
    return null;
  }
  return a / b;
}

console.table() — данные таблицей

Выводит массивы и объекты в виде красивой таблицы. Незаменим при работе с массивами объектов.

const users = [
  { name: "Иван", age: 25 },
  { name: "Мария", age: 30 },
  { name: "Алекс", age: 22 },
];

console.table(users);
// Выведет аккуратную таблицу с колонками name и age

console.time() / console.timeEnd()

Измерить время выполнения блока кода. Полезно при оптимизации.

console.time("мой таймер");
// ... какой-то код ...
for (let i = 0; i < 1000000; i++) {}
console.timeEnd("мой таймер");
// мой таймер: 2.345ms

🕵️ Стратегия отладки: как искать баги

Когда программа работает не так, как ожидается — есть проверенный алгоритм поиска проблемы:

1
Прочитайте ошибку целиком

Не пугайтесь красного текста — прочитайте его внимательно. Какой тип ошибки? Что написано в описании? На какую строку указывает?

2
Идите на строку ошибки

Нажмите на ссылку с файлом и строкой в консоли. Посмотрите на эту строку и несколько строк вокруг неё.

3
Добавьте console.log перед ошибкой

Выведите значения переменных, которые используются на строке с ошибкой. Убедитесь, что они содержат то, что вы ожидаете.

4
Сузьте проблему

Закомментируйте код, упростите функцию. Найдите минимальный пример, который воспроизводит ошибку. Чем меньше кода — тем проще найти проблему.

5
Погуглите ошибку

Скопируйте текст ошибки в Google или Stack Overflow. Скорее всего, кто-то уже сталкивался с такой же проблемой и нашёл решение. Это нормальная практика для всех разработчиков.

// Пример отладки с console.log:

function calculateTotal(items) {
  console.log("items:", items);  // проверяем что пришло

  let total = 0;
  for (let item of items) {
    console.log("item:", item);           // смотрим каждый элемент
    console.log("item.price:", item.price); // проверяем конкретное свойство
    total += item.price;
  }

  console.log("total:", total);  // итоговое значение
  return total;
}

// Если items вдруг null — TypeError появится на for..of
// Но перед этим console.log("items:", null) нам подскажет проблему!

💡 Практические советы начинающему

🧹
Убирайте console.log перед релизом

console.log отлично работает для отладки, но не забывайте убрать их из готового кода — лишние логи засоряют консоль пользователей.

🔬
Пишите маленькими шагами

Написали 5 строк — проверьте что работает. Не пишите 100 строк и потом ищите ошибку. Чем меньше шаг — тем легче найти проблему.

📖
Читайте ошибку полностью

Не закрывайте консоль с испугом. Прочитайте: тип ошибки, описание, файл и строку. 80% случаев — ответ прямо в сообщении.

🌐
Используйте браузерный DevTools

F12 → вкладка Sources → можно ставить breakpoints (точки остановки) и смотреть значения переменных в момент выполнения. Это мощнее чем console.log.

✅ Итоги урока

  • Ошибки — нормальная часть программирования. Не бояться, а уметь читать и исправлять
  • SyntaxError — нарушение синтаксиса (забытые скобки, кавычки, знаки)
  • ReferenceError — обращение к несуществующей переменной или функции
  • TypeError — операция над данными неправильного типа (самая частая ошибка)
  • Сообщение об ошибке содержит: тип, описание и ссылку на файл/строку — читайте его полностью
  • console.log() — вывести значение в консоль. Главный инструмент отладки
  • console.error() / console.warn() — красные и оранжевые сообщения
  • console.table() — вывести массив/объект таблицей
  • Стратегия: прочитать ошибку → найти строку → добавить console.log → сузить проблему → погуглить

Поздравляем с завершением второго модуля! Вы освоили переменные, типы данных, строки, числа, преобразования и отладку — это серьёзный фундамент. Следующий модуль — управляющие конструкции: условия и циклы. 🚀

Тест по уроку: Ошибки и отладка

6 вопросов

Методы консоли

Напишите код, который выводит обычное сообщение через console.log, сообщение об ошибке через console.error и сообщение-предупреждение через console.warn.

Обработка ошибки

Напишите код, который заключает потенциально опасную операцию (например, вызов несуществующей функции в try-catch) в try-catch и выводит сообщение об ошибке через console.error.