包装try...catch
2025/02/10·Javascript·js, 工具函数·16 次浏览
引言
try catch代码块,看着不太舒服,所以想简化一下调用,使用函数包装一下,优雅起来。
代码
function tryCatch(fn, ...args) {
try {
return [undefined, fn.apply(null, args)]
} catch (e) {
return [e, undefined];
}
}
function throws() {
throw new Error("错误信息");
}
console.log(tryCatch(Math.sqrt, 4)); // [ undefined, 2 ]
console.log(tryCatch(throws)); // [ Error: '错误信息', undefined ]
这样使用的时候就可以愉快的一行一行写代码了
const [err, res] = tryCatch(Math.sqrt, 4);
if (err) {
// do something
}
// 接着do soemthing
以上是同步的情况,还有异步也需要考虑,首先需要判断传递的函数是否是异步函数
function isAsyncFunction(fn) {
return fn && fn.constructor.name === 'AsyncFunction';
}
接下来就是处理异步函数了,这里使用promise来处理异步函数,如果函数是异步函数,那么就返回一个promise,如果函数是同步函数,那么就直接返回一个数组。
function tryCatch(fn, ...args) {
if (isAsyncFunction(fn)) {
return new Promise(resolve => {
fn.apply(null, args)
.then(res => {
console.log("resolve", res);
resolve([undefined, res]);
})
.catch(err => {
console.log("reject", err);
resolve([err, undefined]);
});
});
} else {
return [undefined, fn.apply(null, args)];
}
}
// 然后又可以愉快的使用了
async function genErr(){
throw new Error("错误信息");
}
const [err, res] = await tryCatch(genErr);
console.log(err);// Error: 错误信息
console.log(res);// undefined
结语
这样写完就不用再写try catch了,也不用再跳着代码找错误了