javascript - 如何确保在不重新抛出错误或使用 Promise.reject 的情况下捕获异步函数的错误?
问题描述
请看下面的代码。第 5 行:return ex
。
当我打电话时myFunc
,我希望'err'
在控制台中看到,但我看到'yes'
这意味着myFunc
没有捕获外部错误。错误没有冒泡。
这是有道理的,因为我不会重新抛出错误 do:throw ex
或 using Promise.reject(ex)
.
我的问题是:如何确保在不使用上述两种方法的情况下在我的函数之外捕获错误?有办法吗?
async function myFunc() {
try {
throw new Error();
} catch (ex) {
return ex;
}
}
myFunc().then(() => console.log('yes')).catch(() => console.log('err'))
// 'yes'
解决方案
使用异步函数时,您可以使用普通的 javascripttry / catch
来处理错误。
如果你在异步函数中抛出,它返回的承诺将被拒绝。如果您从异步函数返回(就像您在catch
块中所做的那样),则承诺将使用返回的值解决(在您的情况下是例外)
这里有两个示例如何处理可能抛出的异步函数:
// async function that might throw
async function funcThatThrows() {
throw new Error("IT THROWS!");
}
// Exception Handling in other async functions
async function example1() {
try {
let result = await funcThatThrows();
/* ... */
} catch(e) {
console.log("example1:", e.message);
}
}
// Exception handling in non-async functions
function example2() {
funcThatThrows()
.then(result => { /* ... */ })
.catch(err => console.log("example2:", err.message));
}
example1();
example2();
有关异步错误处理的详细教程,请参阅Javascript Async/Await 错误处理 :)
推荐阅读
- reactjs - 如何在 react-final-form 中创建自定义字段?
- node.js - ionic 构建或运行时 lint 完成后没有任何反应
- r - 根据另一列计算滚动天数差异
- css - 我可以使用 CSS 以网格样式显示具有不同高度的项目吗?
- python - 如何在 Python3 中使用递归输出
- java - Thymeleaf 复选框在使用 th:field 时不能默认选中?
- javascript - 如何使用 Javascript 和 Microsoft Visual Studio 从 MySQL 数据库中检索值?
- java - Java:难以理解递归方法调用
- python - 在 matplotlib 图中未绘制几个数据集
- doctrine-orm - 如何使用 PhpUnit/DbUnit 和真正的 Doctrine EntityManager 进行功能测试