我有以下方法
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函式的 s 時,我仍然得到未捕獲的錯誤。

有人可以解釋在執行此類異步函式時如何捕獲所有拋出的錯誤嗎?
下面是一些代碼,這些代碼最終被我傳入引數的一種方法呼叫
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;
uj5u.com熱心網友回復:
您在標記的函式中使用.then/ (并且從不在該函式中使用) - 這可能是錯誤在裂縫之間滑動的原因.catchasyncawait
所以,要么像這樣制作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現在應該正確捕獲和處理拋出的錯誤
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/477787.html
標籤:javascript 有角度的 异步 异步等待
