tengo el siguiente metodo
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; } } Lo rodeo con try/catch dos veces, una externa, la segunda en promise.resolve, sin embargo, todavía obtengo los errores no detectados cuando ejecuto los method pasados como parámetro a esa función de computeParameter de parámetros.
¿Alguien podría explicar cómo capturar todos los errores arrojados al ejecutar tales funciones asíncronas?
a continuación hay un código que termina siendo llamado por uno de los métodos que paso en el parámetro
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;Está utilizando .then / .catch en una función etiquetada como async (y nunca use await en esa función); esta puede ser la razón por la cual los errores se deslizan entre las grietas
Por lo tanto, haga que computeParameter sea así
(nota, no hay async aquí, ya que nunca se usa 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) })); } o ... usando 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) }; } }Eliminé la sintaxis "mecanografiado" para que el código sea más claro y, como usted dice, el mecanografiado es irrelevante para el problema
Usando cualquiera de estos, el error lanzado por displayMessage ahora debería ser capturado y manejado correctamente