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

Javascript-从内部函数和外部函数中抛出不同的错误,javascript,async-await,try-catch,Javascript,Async Await,Try Catch,我的顶部/外部方法“f”有以下代码: 对于在f()中执行的方法,这个函数是: 现在,如果在f中,我想将错误作为functions.https.HttpsError的实例抛出,我想做: async function f() { await g().catch(err => { console.error(err); throw new functions.https.HttpsError("unavailable", "Se

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

对于在f()中执行的方法,这个函数是:

现在,如果在f中,我想将错误作为functions.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()抓住它,然后扔掉它?它的类型是“cancelled”,消息是“Some custom message”,但这样处理错误会导致问题,因为“custom”错误是我从内部捕获错误时在外部函数中抛出的同一类错误的实例

我想扔个东西

async function g() {
     ...

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

         throw error;
     }
}
然后,在f()中,执行以下操作:

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


多谢各位。方法?

如果要将从
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
捕捉该错误,就像同步错误一样。

但是,如果g()抛出的错误类型和消息与我在f()中抛出的错误类型和消息不同,那么抛出对象{type:“x”,message:“x”}是正确的然后像我在问题中描述的那样抓住它?@Raul-恐怕我不明白你在问什么。您是否在询问
async
函数中异常的机制?或者你扔的东西的内容?或
async function g() {
     ...

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

         throw error;
     }
}
     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) */
    });
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");
    }

    // ...
}