Javascript - 从内部函数和外部函数中抛出不同的错误

时间:2021-04-10 17:05:46

标签: javascript async-await try-catch

我的顶部/外部方法“f”有以下代码:

async function f() {
   await g().catch(err => {...});
   ...
}

这是在 f() 中执行的方法:

async function g() {
   await something(); // Can fail because of server problems...

   if (true) {
      throw new functions.https.HttpsError("cancelled", "Some custom message");
   }
}

现在,如果在 f 中,我想将错误作为函数的实例抛出。https.HttpsError,我想这样做:

async function f() {
   await g().catch(err => {
        console.error(err);
        throw new functions.https.HttpsError("unavailable", "Server error") // Unexpected errors... Will be good for errors coming from calling something() in g()

       /* Note: HttpsError -> constructor(type, message) */
    });

   ...
}

如您所见,我正在处理一般错误,类型为“不可用”和一般消息“服务器错误”。

但是......来自条件的错误会发生什么?我怎样才能在 f() 中抓住它,然后扔掉它?它的类型是“已取消”,消息是“一些自定义消息”,但这样我处理错误会导致问题,因为“自定义”错误是我在外部抛出的同一类错误的实例从内部捕获错误时的函数。

我想扔一个物体

async function g() {
     ...

     if (true) {
         const error = {
            type: "cancelled",
            message: "custom error",
         } 

         throw error;
     }
}

然后,在 f() 中执行:

     await g().catch(err => {
        console.error(err);
        throw new functions.https.HttpsError(err.type || "unavailable", err.message || "Server error") // Unexpected errors... Will be good for errors coming from calling something() in g()

       /* Note: HttpsError -> constructor(type, message) */
    });

但是代码看起来不干净。这是处理这些情况的常用方法吗?其他更好的

谢谢。方式?

1 个答案:

答案 0 :(得分:0)

如果您想将从 g() 得到的错误转换为其他错误,惯用的方法是使用 catch 块:

async function f() {
    try {
        await g();
        // ...perhaps other things here as well...
    } catch (err) {
        console.error(err);
        throw new functions.https.HttpsError("unavailable", "Server error");
    }

    // ...
}

请记住,在 async 函数中,如果承诺被拒绝,await promise 将引发错误。您可以使用 catch 捕获该错误,就像同步错误一样。