throw в JS — как правильно бросать и ловить ошибки?
Читаю про обработку ошибок и наткнулся на throw. Не очень понял: зачем самому бросать ошибку, если можно просто вернуть null или вывести console.log?
Как вообще пишется js throw и как потом эту ошибку поймать, чтобы программа не падала целиком? Можно простой пример?
2 ответа
throw нужен, чтобы остановить выполнение и сказать «дальше так нельзя». Это сигнал об ошибке, который можно перехватить и аккуратно обработать, вместо того чтобы программа продолжала работать с мусорными данными.
Бросают обычно объект ошибки:
function divide(a, b) {
if (b === 0) {
throw new Error('Делить на ноль нельзя');
}
return a / b;
}
А ловят через try/catch:
try {
const result = divide(10, 0);
console.log(result);
} catch (err) {
console.log('Поймали ошибку:', err.message);
} finally {
console.log('Этот блок выполнится в любом случае');
}
Что здесь важно:
- как только сработал
throw, выполнение блокаtryпрерывается и управление прыгает вcatch; - в
errприходит сам объект ошибки, у него есть.messageи.name; finallyвыполнится всегда — и при ошибке, и без неё (удобно закрывать что-то, освобождать ресурсы).
Почему throw new Error(...), а не просто throw 'текст'? Потому что у Error есть стек вызовов — будет видно, откуда именно прилетела ошибка. Это сильно помогает при отладке.
Добавлю про частую ошибку новичков: технически можно кинуть что угодно — throw 'строка', throw 42. Но так делать не надо.
Всегда бросай throw new Error('...') (или наследников вроде TypeError). Тогда в catch у тебя всегда будет нормальный объект с .message и стектрейсом, и не придётся гадать, строка там прилетела или число.