hand
_1_11_254
4
返回栏目
0k
2k
1k
2k
1k
1k
1k
2k
2k
2k
1k
2k
1k
2k
1k
1k
1k
1k
1k
2k
1k
1k
1k
1k
1k
1k
1k
1k
1k
2k
1k
1k
1k
1k
1k
1k
1k
1k
1k
2k
1k
1k
1k
1k
1k
1k
1k
2k
1k
2k
1k
1k
1k
1k
1k
1k
1k
2k
2k
1k
1k
1k
2k
1k
1k
2k
2k
1k
1k
1k
2k
1k
1k
2k
2k
1k
2k
1k
1k
2k
2k
2k
3k
3k
2k
3k
2k
3k
3k
3k
1k
2k
3k
2k
2k
3k
3k
2k
2k
6k
3k
2k
2k
5k
3k
4k
3k
3k
2k
4k
3k
3k
2k
3k
3k
1k
4k
4k
4k
2k
5k
3k
2k
3k
4k
3k
3k
4k
2k
3k
3k
4k
2k
2k
3k
4k
3k
3k
2k
5k
2k
3k
3k
3k
3k
2k
3k
3k
3k
2k
2k
2k
2k
3k
2k
2k
2k
3k
2k
2k
2k
2k
2k
2k
0.1k
0.2k
3k
2k
3k
2k
0.1k
2k
2k
4k
2k
2k
1k
2k
2k
3k
3k
3k
3k
2k
2k
3k
3k
3k
4k
3k
3k
4k
3k
2k
2k
3k
3k
3k
3k
3k
3k
2k
3k
3k
4k
4k
3k
3k
2k
2k
3k
2k
2k
1k
2k
3k
1k
2k
2k
2k
2k
2k
2k
2k
2k
2k
4k
2k
3k
2k
1k
2k
2k
2k
2k
2k
3k
2k
3k
1k
2k
2k
2k
0k
2k
2k
2k
2k
2k
2k
2k
3k
2k
2k
1k
1k
3k
2k
3k
1k
2k
1k
2k
2k
2k
2k
3k
1k
3k
2k
2k
2k
2k
2k
2k
1k
2k
2k
4k
3k
3k
2k
2k
2k
2k
2k
2k
4k
3k
3k
3k
2k
2k
2k
2k
2k
2k
3k
4k
返回前端 - Javascript栏目
作者:
贺及楼
成为作者
更新日期:2025-02-21 21:07:00
在 JavaScript 的世界里,错误处理是一个至关重要的环节。当代码运行出现问题时,我们需要准确地知道问题出在哪里,以及为什么会出现问题。Error 对象一直是 JavaScript 中处理错误的核心,而 ES2022 引入的 cause
属性为错误处理带来了新的便利和更强大的功能。
在 cause
属性出现之前,当我们捕获一个错误并重新抛出时,原始错误的上下文信息往往会丢失。例如,在调用一个异步 API 时,可能会因为网络问题抛出一个错误,当我们在更高层级的代码中捕获这个错误并处理时,可能会因为缺少原始错误信息而难以定位问题。
function callAPI() {
try {
// 模拟 API 调用失败
throw new Error('Network error');
} catch (error) {
// 重新抛出一个新的错误
throw new Error('API call failed');
}
}
try {
callAPI();
} catch (error) {
console.log(error.message); // 输出: API call failed
// 这里无法得知原始的网络错误信息
}
在这个例子中,当 callAPI
函数捕获到网络错误后,重新抛出了一个新的错误,原始的 “Network error” 信息就丢失了。
为了解决上述问题,ES2022 为 Error
构造函数引入了一个可选的 options
参数,其中包含 cause
属性。cause
属性可以用来传递原始错误,这样在处理错误时,我们就可以获取到完整的错误信息。
const originalError = new Error('Original error message');
const newError = new Error('New error message', { cause: originalError });
function callAPI() {
try {
// 模拟 API 调用失败
throw new Error('Network error');
} catch (error) {
// 重新抛出一个新的错误,并传递原始错误
throw new Error('API call failed', { cause: error });
}
}
try {
callAPI();
} catch (error) {
console.log(error.message); // 输出: API call failed
console.log(error.cause.message); // 输出: Network error
}
在这个例子中,当 callAPI
函数捕获到网络错误后,重新抛出一个新的错误,并将原始错误作为 cause
属性传递。在更高层级的代码中捕获这个新错误时,就可以通过 error.cause
获取到原始错误信息。
当使用第三方库时,库中可能会抛出各种不同类型的错误。为了更好地管理这些错误,我们可以封装这些错误,并传递原始错误信息。
function useThirdPartyLibrary() {
try {
// 模拟第三方库抛出错误
throw new TypeError('Invalid input');
} catch (error) {
// 封装错误并传递原始错误
throw new Error('Third party library error', { cause: error });
}
}
try {
useThirdPartyLibrary();
} catch (error) {
console.log(error.message); // 输出: Third party library error
console.log(error.cause.message); // 输出: Invalid input
}
在异步代码中,cause
属性同样非常有用。例如,在使用 async/await
时,我们可以捕获异步操作中的错误,并传递原始错误信息。
async function fetchData() {
try {
// 模拟异步请求失败
await new Promise((_, reject) => {
setTimeout(() => {
reject(new Error('Fetch failed'));
}, 1000);
});
} catch (error) {
// 重新抛出错误并传递原始错误
throw new Error('Data fetching error', { cause: error });
}
}
async function main() {
try {
await fetchData();
} catch (error) {
console.log(error.message); // 输出: Data fetching error
console.log(error.cause.message); // 输出: Fetch failed
}
}
main();
特性 | 描述 |
---|---|
cause 属性 |
ES2022 为 Error 构造函数引入的可选属性,用于传递原始错误信息 |
作用 | 解决重新抛出错误时原始错误上下文信息丢失的问题,方便错误定位和调试 |
应用场景 | 封装第三方库的错误、异步错误处理等 |
Error
对象的 cause
属性为 JavaScript 的错误处理带来了很大的提升,让我们在处理复杂的错误场景时能够更轻松地获取到完整的错误信息,提高了代码的可维护性和调试效率。
前端 - Javascript
整章节共299节
快分享给你的小伙伴吧 ~