Уроки модуля (4/4)
попробовать/поймать/бросить
Ошибка в JavaScript — это значение (обычно объект Error), которое прерывает нормальный поток.
и поднимает стек вызовов до тех пор, пока кто-нибудь его не перехватит. Конструкция для обработки этого случая:
try / catch.
Выдает ошибку: throw
function dividi(a, b) {
if (b === 0) {
throw new Error('Divisione per zero');
}
return a / b;
}throw немедленно прерывает текущую функцию.
Перехват: try / catch
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 (необязательно)
Код, который выполняется всегда, независимо от того, есть ли ошибка или нет. Полезно для закрытия ресурсов:
try {
// ... operazione rischiosa
} catch (err) {
// ... log
} finally {
// ... pulizia (sempre eseguita)
}Когда его использовать (а когда нет)
- Да: операции ввода-вывода (
JSON.parseдля ненадежного ввода,fetch, доступ к диску), преобразования, которые может потерпеть неудачу. - А может и нет: для нормального потока. Если вы знаете, что введенные данные могут быть недействительными, лучше проверить их.
с
if, чем бросать и ловить.
// 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: '...' }Попробуйте это
Определите `safeDivide(a, b)`: если b равно 0, выдайте ошибку с сообщением "Деление на ноль", в противном случае верните a/b.
Показать подсказку
if (b === 0) выдать новую ошибку('...'); затем верните a/b.
Решение доступно после 3 попыток
Обзор упражнения
Определите `parseJsonSafe(text)`: если текст допустим, JSON return { ok: true, value: <object> }, в противном случае { ok: false }. Используйте try/catch для JSON.parse.
Показать подсказку
Оберните JSON.parse в try; в улове return {ok: false}.
Решение доступно после 3 попыток