Загрузка...

Ошибки в JavaScript

Ошибка — это способ функции отказаться продолжать. На этой странице заказ { drink: "tea" } без size. throw new Error("missing size") останавливает label сразу, до return. catch получает этот Error. Строка страницы читается как caught / missing size.

Это не страница отладки

Прошлая страница вызвала console.error("missing size") и затем вернула запасную строку. Скрипт продолжился. Ничего не было брошено. console.error не бросает.
throw устроен иначе. Строки после него в той же функции не выполняются. Подхватить может только catch. Строка прошлой отладки была fixed / tea / regular.

У Error две строки

new Error("missing size") создаёт объект. error.name равен Error. error.message — переданный текст, missing size. Печатать сам объект менее полезно, чем эти два поля.

catch получает Error

label бросает, когда нет size. Вызов стоит внутри try, поэтому выполняется catch и печатает error.message. Текст — missing size.

Поймать отсутствие размера

javascript
function label(order) {
if (!order.size) {
throw new Error("missing size");
}
return order.drink + " / " + order.size;
}
try {
console.log(label({ drink: "tea" }));
} catch (error) {
console.log(error.message);
}

В записи missing size. label так и не дошёл до return, поэтому tea / missing size здесь не появляется.

Полный заказ пропускает catch

Дай size значение regular. label возвращается как обычно. catch не выполняется.

Полный заказ

javascript
function label(order) {
if (!order.size) {
throw new Error("missing size");
}
return order.drink + " / " + order.size;
}
try {
console.log(label({ drink: "tea", size: "regular" }));
} catch (error) {
console.log(error.message);
}

В записи tea / regular.

finally выполняется в обоих случаях

finally идёт после try, если вызов успешен, и после catch, если он бросает. Используй его для шага, который нужен в обоих случаях.

finally после throw

javascript
function label(order) {
if (!order.size) {
throw new Error("missing size");
}
return order.drink + " / " + order.size;
}
try {
label({ drink: "tea" });
} catch (error) {
console.log(error.message);
} finally {
console.log("done");
}

В записи сначала missing size, затем done. После броска finally пишет done.

Прочитай имя и сообщение

Поймай тот же Error и напечатай оба поля отдельными строками.

Имя и сообщение

javascript
try {
throw new Error("missing size");
} catch (error) {
console.log(error.name);
console.log(error.message);
}

В записи сначала Error, затем missing size. Значит, error.name равен Error, а error.message равен missing size.

Проверка бросает, вызывающий ловит

requireSize знает правило. Она бросает и не строит подпись. Вызывающий решает, что печатать.

Отделить проверку

javascript
function requireSize(order) {
if (!order.size) {
throw new Error("missing size");
}
}
try {
requireSize({ drink: "tea" });
console.log("ok");
} catch (error) {
console.log(error.message);
}

В записи missing size. Строка console.log("ok") не выполняется, потому что бросок из requireSize перешёл в catch.

Строка под чашкой

Страница вызывает label без размера. catch собирает видимую строку из сообщения.

Демо страницы — пойманная ошибка

html
<!DOCTYPE html>
<html>
<body>
<p id="line">…</p>
<script>
function label(order) {
if (!order.size) {
throw new Error("missing size");
}
return order.drink + " / " + order.size;
}
let line = "";
try {
line = label({ drink: "tea" });
} catch (error) {
line = "caught / " + error.message;
}
document.getElementById("line").textContent = line;
</script>
</body>
</html>

Строка читается как caught / missing size. Полный заказ вернул бы tea / regular и оставил бы catch неиспользованным. fixed / tea / regular была строкой страницы отладки.

У стойки

  1. Вызови label({ drink: "tea" }) внутри try. Запись catch — missing size.
  2. Вызови label({ drink: "tea", size: "regular" }). В записи tea / regular, и catch не выполняется.
  3. Добавь finally вокруг неудачного вызова. Вторая запись — done.
  4. Прочитай error.name и error.message. В записи Error и missing size.
  5. Прочитай строку страницы: caught / missing size.

Промахи у стойки

throw останавливает функцию. console.error не бросает и функцию не останавливает.

  • Ждать, что строки после throw выполнятся
  • Забыть catch и оставить ошибку непойманной
  • Думать, что finally идёт только после успеха
  • Читать error.message как имя Error
  • Читать строку как fixed / tea / regular

Оставь это

  • throw new Error("missing size") останавливает label до return
  • catch получает Error и печатает error.message, равный missing size
  • Полный заказ пишет tea / regular и пропускает catch
  • После броска finally пишет done
  • Строка страницы читается как caught / missing size

🧠 Проверьте Свои Знания

Готов к Началу

Проверьте Свои Знания

Бросьте себе вызов с помощью этой интерактивной викторины и узнайте, насколько хорошо вы понимаете тему

❓
5
Вопросы
🎯
70%
Для Прохождения
♾️
∞
Время
🔄
∞
Попытки

📝 Инструкции

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