Перейти к основному содержимому

Причины ошибок

· 2 мин. чтения
Victor Gomes ([@VictorBFG](https://twitter.com/VictorBFG))

Представьте, что у вас есть функция, вызывающая две отдельные рабочие нагрузки doSomeWork и doMoreWork. Обе функции могут вызывать одинаковые ошибки, но вам нужно обрабатывать их по-разному.

Перехват ошибки и повторное её выбрасывание с дополнительной контекстной информацией - это распространённый подход к решению этой проблемы, например:

function doWork() {
try {
doSomeWork();
} catch (err) {
throw new CustomError('Некоторая работа не выполнена', err);
}
doMoreWork();
}

try {
doWork();
} catch (err) {
// Ошибка |err| происходит из |doSomeWork| или |doMoreWork|?
}

К сожалению, указанное выше решение трудоёмко, так как необходимо создавать собственный CustomError. И, что ещё хуже, ни одно средство для разработчиков не может предоставить полезные диагностические сообщения для неожиданных исключений, так как нет консенсуса по поводу того, как правильно представлять эти ошибки.

Ранее не хватало стандартного способа связывания ошибок. Теперь JavaScript поддерживает причины ошибок. Дополнительный параметр options можно добавить в конструктор Error со свойством cause, значение которого будет присвоено экземплярам ошибки. Ошибки можно легко связывать.

function doWork() {
try {
doSomeWork();
} catch (err) {
throw new Error('Некоторая работа не выполнена', { cause: err });
}
try {
doMoreWork();
} catch (err) {
throw new Error('Дополнительная работа не выполнена', { cause: err });
}
}

try {
doWork();
} catch (err) {
switch(err.message) {
case 'Некоторая работа не выполнена':
handleSomeWorkFailure(err.cause);
break;
case 'Дополнительная работа не выполнена':
handleMoreWorkFailure(err.cause);
break;
}
}

Эта функция доступна в V8 v9.3.

Поддержка причин ошибок