返回

包装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了,也不用再跳着代码找错误了