重写错误捕获高阶函数来捕获异步错误?

use*_*776 2 asynchronous functional-programming async-await typescript

这里我有一个函数,可以很好地捕获同步错误,并在重新抛出错误之前对它们进行处理。

    function logExceptions<T extends (...args: any[]) => any>(func: T): (...funcArgs: Parameters<T>) => ReturnType<T> {
      return (...args: Parameters<T>): ReturnType<T> => {
        try {
          return func(...args);
        } catch (err) {
          console.log(func.name + " caused an error")
          throw err;
        }
      };
    }

function syncExample() { 
  throw new Error()
}

logExceptions(syncExample)();
Run Code Online (Sandbox Code Playgroud)

控制台日志

“syncExample 导致错误”

我可以重写此函数以使其与异步无关并且也适用于异步函数吗?

async function asyncExample() { 
  throw new Error()
}
logExceptions(asyncExample)();
Run Code Online (Sandbox Code Playgroud)

所需的控制台.log

“asyncExample 导致错误”

实际的console.log

””

Ber*_*rgi 5

我可以重写此函数以使其与异步无关并且也适用于异步函数吗?

不。虽然您可以尝试重载它并检测该函数是否会返回承诺,但这是非常脆弱的。最好编写一个单独的函数来包装异步函数:

function logExceptions<T extends any[], U>(func: (...args: T) => PromiseLike<U>): (...args: T) => Promise<U> {
  return async (...args) => {
    try {
      return await func(...args);
    } catch (err) {
      console.log(func.name + " caused an error")
      throw err;
    }
  };
}
Run Code Online (Sandbox Code Playgroud)