Не теряйте настоящую причину ошибки при создании новой!
При обработке ошибок часто хочется добавить контекст. Но обычный throw new Error(...) скрывает исходную ошибку, из-за чего отладка становится сложнее.
try {
return await fetchUser(id);
} catch (error) {
throw new Error(`Не удалось загрузить user ${id}`);
}
В JavaScript у Error есть опция cause, которая позволяет сохранить оригинальную ошибку внутри новой.
try {
return await fetchUser(id);
} catch (error) {
throw new Error(`Не удалось загрузить user ${id}`, {
cause: error
});
}
Теперь выше по стеку доступен и понятный контекст, и первоначальная причина сбоя:
try {
await loadUser(42);
} catch (error) {
console.log(error.message);
console.log(error.cause);
}
🔥 Это полезно в сервисных слоях и библиотеках: каждый уровень может добавить свой контекст, не уничтожая информацию об исходной ошибке.
📣 JS Ready | #совет
При обработке ошибок часто хочется добавить контекст. Но обычный throw new Error(...) скрывает исходную ошибку, из-за чего отладка становится сложнее.
try {
return await fetchUser(id);
} catch (error) {
throw new Error(`Не удалось загрузить user ${id}`);
}
В JavaScript у Error есть опция cause, которая позволяет сохранить оригинальную ошибку внутри новой.
try {
return await fetchUser(id);
} catch (error) {
throw new Error(`Не удалось загрузить user ${id}`, {
cause: error
});
}
Теперь выше по стеку доступен и понятный контекст, и первоначальная причина сбоя:
try {
await loadUser(42);
} catch (error) {
console.log(error.message);
console.log(error.cause);
}
🔥 Это полезно в сервисных слоях и библиотеках: каждый уровень может добавить свой контекст, не уничтожая информацию об исходной ошибке.
📣 JS Ready | #совет