Ошибки в 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.
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 не выполняется.
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, если он бросает. Используй его для шага, который нужен в обоих случаях.
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 и напечатай оба поля отдельными строками.
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 знает правило. Она бросает и не строит подпись. Вызывающий решает, что печатать.
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 собирает видимую строку из сообщения.
<!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 была строкой страницы отладки.
У стойки
- Вызови
label({ drink: "tea" })внутриtry. Запись catch — missing size. - Вызови
label({ drink: "tea", size: "regular" }). В записи tea / regular, и catch не выполняется. - Добавь
finallyвокруг неудачного вызова. Вторая запись — done. - Прочитай
error.nameиerror.message. В записи Error и missing size. - Прочитай строку страницы: caught / missing size.
Промахи у стойки
throw останавливает функцию. console.error не бросает и функцию не останавливает.
- Ждать, что строки после
throwвыполнятся - Забыть
catchи оставить ошибку непойманной - Думать, что
finallyидёт только после успеха - Читать
error.messageкак имяError - Читать строку как fixed / tea / regular
Оставь это
throw new Error("missing size")останавливаетlabelдоreturncatchполучает Error и печатаетerror.message, равный missing size- Полный заказ пишет tea / regular и пропускает
catch - После броска
finallyпишет done - Строка страницы читается как caught / missing size
🧠 Проверьте Свои Знания
Проверьте Свои Знания
Бросьте себе вызов с помощью этой интерактивной викторины и узнайте, насколько хорошо вы понимаете тему
📝 Инструкции
- Внимательно прочитайте каждый вопрос
- Выберите лучший ответ на каждый вопрос
- Вы можете пересдавать тест столько раз, сколько захотите
- Ваш прогресс будет показан вверху