引发自定义错误异步/等待try-catch

时间:2018-07-12 11:33:46

标签: javascript error-handling async-await

假设我有这样的功能-

doSomeOperation = async () => {
  try {
    let result = await DoSomething.mightCauseException();
    if (result.invalidState) {
      throw new Error("Invalid State error");
    }

    return result;
  } catch (error) {
    ExceptionLogger.log(error);
    throw new Error("Error performing operation");
  }
};

这里DoSomething.mightCauseException是一个异步调用,可能会导致异常,我正在使用try..catch来处理它。但是,然后使用获得的结果,我可能会决定我需要告诉doSomeOperation的调用者该操作由于某种原因而失败。

在上面的函数中,我抛出的Errorcatch块捕获,只有通用的Error被抛出给doSomeOperation的调用者。

doSomeOperation的呼叫者可能正在执行以下操作-

doSomeOperation()
  .then((result) => console.log("Success"))
  .catch((error) => console.log("Failed", error.message))

我的自定义错误永远不会出现。

在构建Express应用程序时可以使用此模式。路由处理程序将调用某些可能希望以不同方式失败的函数,并让客户端知道其失败原因。

我想知道如何做到这一点?这里还有其他模式可循吗?谢谢!

2 个答案:

答案 0 :(得分:2)

只需更改行的顺序即可。

doSomeOperation = async() => {
    let result = false;
    try {
        result = await DoSomething.mightCauseException();
    } catch (error) {
        ExceptionLogger.log(error);
        throw new Error("Error performing operation");
    }
    if (!result || result.invalidState) {
        throw new Error("Invalid State error");
    }
    return result;
};

更新1

或者您可以如下创建自定义错误。

class MyError extends Error {
  constructor(m) {
    super(m);
  }
}

function x() {
  try {
    throw new MyError("Wasted");
  } catch (err) {
    if (err instanceof MyError) {
      throw err;
    } else {
      throw new Error("Bummer");
    }
  }

}

x();

更新2

根据您的情况将其映射,

class MyError extends Error {
  constructor(m) {
    super(m);
  }
}

doSomeOperation = async() => {
  try {
    let result = await mightCauseException();
    if (result.invalidState) {
      throw new MyError("Invalid State error");
    }

    return result;
  } catch (error) {
    if (error instanceof MyError) {
      throw error;
    }
    throw new Error("Error performing operation");
  }
};

async function mightCauseException() {
  let random = Math.floor(Math.random() * 1000);
  if (random % 3 === 0) {
    return {
      invalidState: true
    }
  } else if (random % 3 === 1) {
    return {
      invalidState: false
    }
  } else {
    throw Error("Error from function");
  }
}


doSomeOperation()
  .then((result) => console.log("Success"))
  .catch((error) => console.log("Failed", error.message))

答案 1 :(得分:0)

您可以简单地使用throw而不是使用Error构造函数

const doSomeOperation = async () => {
  try {
      throw {customError:"just throw only "}
  } catch (error) {
    console.log(error)
  }
};

doSomeOperation()