在解决承诺时摆脱未捕获的错误

Get rid of uncaught errors when resolving a promise

我有以下方法

export abstract class BaseCalculator {
  /**
   * Compute the promise parameter.
   * @param name name of the parameter.
   * @param method promise to resolve.
   * @returns CalculatorResult.
   */
  public async computeParameter(name: string, method: Promise<string | number | boolean | ParamString>): Promise<CalculatorResult> {
    try {
      return Promise.resolve(method)
        .then(
          (computedValue: string | number | boolean | ParamString) =>
            this.getCalculatorResult(name, computedValue)
        )
        .catch((e: string | CalculatorError) => ({ // <<<<<<<<<<<<<<<<< HERE
          name: name,
          value: e instanceof CalculatorError ? e.value : NaN,
          error: e instanceof CalculatorError ? e : new CalculatorError(name, NaN, ErrorLevel.ERROR, e)
        } as CalculatorResult));
    }
    catch (e) { // <<<<<<<<<<<<<<<<< HERE
      return {
        name: name,
        value: e instanceof CalculatorError ? e.value : NaN,
        error: e instanceof CalculatorError ? e : new CalculatorError(name, NaN, ErrorLevel.ERROR, String(e))
      } as CalculatorResult;
    }
  }

我用 try/catch 包围它两次,一次在外部,第二次在 promise.resolve 上,但是在执行作为参数传递给它的 method 时我仍然遇到未捕获的错误computeParameter 函数。

有人可以解释一下在执行此类异步函数时如何捕获所有抛出的错误吗?

下面是一些代码,最终由我传入参数的方法之一调用

export function displayMessage(field: string, value: any, message: string, errorLevel: ErrorLevel): void {
  throw new CalculatorError(field, value, errorLevel, message)
}

export async function checkAngleSTR(
  STA: EnumSTA,
  KUNIT: number,
  STR: number,
  NEDSF: number,
  BFL: number,
  HFL: number,
  FCTM: number,
): Promise<void> {

  let ac: number = BFL * HFL;

  switch (STA) {
    case EnumSTA.EN1992_1_1_BS:
    case EnumSTA.EN1992_2_BS:
    case EnumSTA.EN_1992_3_BS:
      if (STR < 21.8 || STR > 45) {
        displayMessage("STR", NaN, "L'angle d'inclinaison de la bielle doit être compris entre 21.8° et 45°", ErrorLevel.ERROR);
      }
      break;

您在标记为 async 的函数中使用了 .then/.catch(永远不要在该函数中使用 await)- 这 可能 是错误在裂缝之间溜走的原因

所以,要么像这样制作 computeParameter

(注意,这里没有 async,因为从未使用过 await

computeParameter(name, method) {
    return method
        .then((computedValue) => this.getCalculatorResult(name, computedValue))
        .catch(e) => ({
            name,
            value: e instanceof CalculatorError ? e.value : NaN,
            error: e instanceof CalculatorError ? e : new CalculatorError(name, NaN, ErrorLevel.ERROR, e)
        }));
    }

或...使用async/await

async computeParameter(name, method) {
    try {
        const computedValue = await method;
        return this.getCalculatorResult(name, computedValue);
    } catch (e) {
        return {
            name,
            value: e instanceof CalculatorError ? e.value : NaN,
            error: e instanceof CalculatorError ? e : new CalculatorError(name, NaN, ErrorLevel.ERROR, e)
        };
    }
}

我删除了“打字稿”语法以使代码更清晰,而且正如您所说,打字稿与问题无关

使用其中任何一个,displayMessage 抛出的错误现在应该被正确捕获和处理