假设我有这样的功能-
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
的调用者该操作由于某种原因而失败。
在上面的函数中,我抛出的Error
被catch
块捕获,只有通用的Error
被抛出给doSomeOperation
的调用者。
doSomeOperation
的呼叫者可能正在执行以下操作-
doSomeOperation()
.then((result) => console.log("Success"))
.catch((error) => console.log("Failed", error.message))
我的自定义错误永远不会出现。
在构建Express应用程序时可以使用此模式。路由处理程序将调用某些可能希望以不同方式失败的函数,并让客户端知道其失败原因。
我想知道如何做到这一点?这里还有其他模式可循吗?谢谢!
答案 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()