Перейти к основному содержимому
Модуль 5 · Урок 4 из 420/32 в курсе~12 min
Уроки модуля (4/4)

попробовать/поймать/бросить

Ошибка в JavaScript — это значение (обычно объект Error), которое прерывает нормальный поток. и поднимает стек вызовов до тех пор, пока кто-нибудь его не перехватит. Конструкция для обработки этого случая: try / catch.

Выдает ошибку: throw

JS
function dividi(a, b) {
  if (b === 0) {
    throw new Error('Divisione per zero');
  }
  return a / b;
}

throw немедленно прерывает текущую функцию.

Перехват: try / catch

JS
try {
  const r = dividi(10, 0);
  console.log('ok', r);
} catch (err) {
  console.log('errore:', err.message); // 'errore: Divisione per zero'
}

// Il programma continua qui, anche se c'è stato un errore.

Все внутри try выполняется; если выдается ошибка (через throw или любую операцию, которая не удается), управление переходит к блоку catch. Переменная после catch (...) получает ошибку.

finally (необязательно)

Код, который выполняется всегда, независимо от того, есть ли ошибка или нет. Полезно для закрытия ресурсов:

JS
try {
  // ... operazione rischiosa
} catch (err) {
  // ... log
} finally {
  // ... pulizia (sempre eseguita)
}

Когда его использовать (а когда нет)

  • Да: операции ввода-вывода (JSON.parse для ненадежного ввода, fetch, доступ к диску), преобразования, которые может потерпеть неудачу.
  • А может и нет: для нормального потока. Если вы знаете, что введенные данные могут быть недействительными, лучше проверить их. с if, чем бросать и ловить.
JS
// Tipico: parsing JSON difensivo
function parseJsonSafe(text) {
  try {
    return { ok: true, value: JSON.parse(text) };
  } catch (err) {
    return { ok: false, error: err.message };
  }
}

parseJsonSafe('{"a":1}'); // { ok: true, value: {a:1} }
parseJsonSafe('non json'); // { ok: false, error: '...' }

Попробуйте это

Упражнение#js.m5.l4.e1
Попыток: 0Загрузка…

Определите `safeDivide(a, b)`: если b равно 0, выдайте ошибку с сообщением "Деление на ноль", в противном случае верните a/b.

Загрузка редактора…
Показать подсказку

if (b === 0) выдать новую ошибку('...'); затем верните a/b.

Решение доступно после 3 попыток

Обзор упражнения

Упражнение#js.m5.l4.e2
Попыток: 0Загрузка…

Определите `parseJsonSafe(text)`: если текст допустим, JSON return { ok: true, value: <object> }, в противном случае { ok: false }. Используйте try/catch для JSON.parse.

Загрузка редактора…
Показать подсказку

Оберните JSON.parse в try; в улове return {ok: false}.

Решение доступно после 3 попыток