柯里化错误处理包装器通过高阶函数封装try/catch与策略配置,支持重试、降级、静默等模式,保持原函数签名和类型安全,天然兼容Promise与async/await。

用柯里化实现统一错误处理包装,核心是把“原始函数 + 错误处理逻辑”拆成可复用的高阶函数,让每次调用都自动捕获异常、执行统一兜底(如日志、提示、重试),同时不侵入业务逻辑。
基础柯里化错误包装器
先写一个能接收处理函数和默认错误策略的柯里化包装器:
示例:简单封装 try/catch + 统一错误上报
const withErrorHandling = (onError = console.error) => (handler) => async (...args) => {
try {
return await handler(...args);
} catch (err) {
onError(err, { args });
throw err; // 可选:继续抛出供上层处理
}
};
使用时只需一层调用即可生成带错误处理的版本:
const safeFetch = withErrorHandling(reportToSentry)(fetchApi);const safeSave = withErrorHandling(showToast)(saveToDB);
支持配置化策略(重试、降级、静默)
进阶版可接受策略对象,让同一包装器适配不同场景:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
const withErrorHandling = (options = {}) => {
const {
onError = console.error,
onFallback = () => null,
retry = 0,
silent = false
} = options;
<p>return (fn) => async (...args) => {
let lastErr;
for (let i = 0; i setTimeout(r, 100 * (i + 1)));
}
}</p><pre class="brush:php;toolbar:false;">if (!silent) onError(lastErr, { args, retry });
return onFallback(lastErr);}; };
这样就能灵活组合:
const fetchWithRetry = withErrorHandling({ retry: 2, onError: logError })(api.fetch);const optionalParse = withErrorHandling({ silent: true, onFallback: () => ({ ok: false }) })(JSON.parse);
与 Promise 链/async 函数天然兼容
柯里化后的函数保持原函数签名和异步行为,可直接用于 .then()、await 或 Promise.all():
const safeLoad = withErrorHandling(console.warn)(loadUser); <p>// ✅ 正常 await const user = await safeLoad(123);</p><p>// ✅ 正常参与并发 const [a, b] = await Promise.all([ safeLoad(1), safeLoad(2) ]);</p><p>// ✅ 正常链式调用 safeLoad(1).then(handleUser).catch(handleLoadFail);</p>
配合 TypeScript 提升类型安全
加一层泛型,确保输入输出类型不丢失:
const withErrorHandling = <t extends any> any>(
options: ErrorHandlingOptions = {}
) => (fn: T): T => {
return ((...args: Parameters<t>) => {
// ... 实现同上
return fn(...args) as ReturnType<t>;
}) as T;
};</t></t></t>
调用后类型仍精确推导,IDE 能正确提示参数和返回值,避免 any 泛滥。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










