gpt4 book ai didi

javascript - 如何包装 Javascript 函数以便捕获所有错误,包括 Promise 拒绝

转载 作者:行者123 更新时间:2023-12-02 22:17:39 26 4
gpt4 key购买 nike

我想编写一个用于包装其他函数的函数,以便捕获所有错误,包括由 Promise 拒绝生成的错误(通常需要 .catch Promise 方法)。

目标是能够包装函数,以便处理所有运行时错误。一个示例用法是我们想要运行的函数,但这是可选的,不是核心业务流程的一部分。如果出现错误,我们希望报告它并稍后修复它,但我们不希望它停止程序流程。

它应该能够使用任意数量的参数包装函数,并返回与原始函数相同的值,包括原始函数是否返回 promise 。

我是否处理以下所有可能的情况?有没有更简单的方法来做到这一点?

const catchAllErrors = (fn) => (...args) => {
try {
const possiblePromise = fn(...args);

// Is it a promise type object? Can't use "instanceof Promise" because just
// for example, Bluebird promise library is not an instance of Promise.
if (typeof possiblePromise.catch === 'function') {
return Promise.resolve(possiblePromise).catch((error) => {
console.log('Caught promise error.', error);
});
}

return possiblePromise;

} catch (error) {
console.log('Caught error.', error);
}
};

// EXAMPLE USAGE

// Applying the wrapper to various types of functions:

const throwsErr = catchAllErrors((x, y) => {
throw `Error 1 with args ${x}, ${y}.`;
});

const promiseErr = catchAllErrors((a, b) => Promise.reject(`Error 2 with args ${a}, ${b}.`));

const noError = catchAllErrors((name) => `Hi there ${name}.`);

const noErrorPromise = catchAllErrors((wish) => Promise.resolve(`I wish for ${wish}.`));

// Running the wrapped functions:

console.log(throwsErr(1, 2));

promiseErr(3, 4).then((result) => console.log(result));

console.log(noError('folks'));

noErrorPromise('sun').then((result) => console.log(result));

最佳答案

不要试图自己去检测某件事是否是一个 promise 。使用 Promise 解析的内置 thenable 检测。您可以使用 Promise 构造函数来捕获异常:

const catchAllErrors = (fn) => (...args) => {
return new Promise(resolve => {
resolve(fn(...args));
}).catch((error) => {
console.log('Caught error.', error);
});
};

或者只是使用async/await语法:

const catchAllErrors = (fn) => async (...args) => {
try {
return await fn(...args);
} catch (error) {
console.log('Caught error.', error);
}
};

(如果您无论如何使用 Bluebird,您也可以为此目的调用其 Promise.try method)

关于javascript - 如何包装 Javascript 函数以便捕获所有错误,包括 Promise 拒绝,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59336568/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com