异步高阶函数统一包装错误处理的核心是用高阶函数接收异步函数并返回自动捕获错误的新函数,支持try/catch或.catch()统一处理、兼容同步抛错与异步reject、可配置错误处理器且typescript类型安全。

在 JavaScript 中,异步高阶函数统一包装错误处理的核心思路是:用一个高阶函数接收异步函数作为参数,返回一个自动捕获 try/catch 或 .catch() 的新函数,避免每个调用处重复写错误处理逻辑。
用 try/catch 包装 async 函数
适用于 async function 形式,最直观可控:
function withErrorHandling(fn) {
return async function(...args) {
try {
return await fn(...args);
} catch (error) {
console.error('Async error caught:', error);
// 可统一上报、重试、转换错误类型等
throw error; // 或返回 { success: false, error }
}
};
}
// 使用示例
const fetchUser = withErrorHandling(async (id) => {
const res = await fetch(`/api/users/${id}`);
if (!res.ok) throw new Error(`HTTP ${res.status}`);
return res.json();
});
// 调用时无需再 try/catch
fetchUser(123).then(console.log).catch(console.warn);
兼容 Promise 返回值(泛化版)
支持普通函数返回 Promise,不强制要求 async:
function withErrorHandling(fn) {
return function(...args) {
return Promise.resolve()
.then(() => fn(...args))
.catch((error) => {
console.error('Promise rejection caught:', error);
throw error;
});
};
}
- 利用
Promise.resolve().then()确保进入 Promise 链,统一处理同步抛错和异步 reject - 比直接
fn(...args).catch()更健壮——能捕获函数内部同步抛出的错误(如参数校验失败)
支持自定义错误处理器
让错误处理策略可配置,提升复用性:
function withErrorHandling(fn, handler = console.error) {
return function(...args) {
return Promise.resolve()
.then(() => fn(...args))
.catch((error) => {
handler(error, { fnName: fn.name || 'anonymous', args });
throw error;
});
};
}
// 自定义上报 + 降级
const safeFetch = withErrorHandling(
fetch,
(err, ctx) => {
Sentry.captureException(err);
localStorage.setItem('last-fetch-error', JSON.stringify({ err, ctx }));
}
);
配合 TypeScript 类型更安全
保留原函数签名,避免类型丢失:
type AsyncFn<t extends any r> = (...args: T) => Promise<r>;
function withErrorHandling<t extends any r>(
fn: AsyncFn<t r>,
handler?: (error: unknown, ctx: { fnName: string; args: T }) => void
): AsyncFn<t r> {
return function(...args: T): Promise<r> {
return Promise.resolve()
.then(() => fn(...args))
.catch((error) => {
handler?.(error, { fnName: fn.name, args });
throw error;
});
};
}
</r></t></t></t></r></t>
- TypeScript 能推导出返回函数与原函数完全一致的参数和返回类型
- 编辑器提示、自动补全、类型检查都不受影响
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











