当前位置: 首页 > 知识库问答 >
问题:

如何使用JS捕获异步错误?

袁华清
2023-03-14

是否可以使用promises的ES6.catch语法捕获异步错误?例如,以下操作不起作用(.catch未捕获错误):

new Promise((resolve, reject)=>{
    setTimeout(()=>{throw new Error("uh oh")}, 1);
}).then(number=>{
    console.log("Number: " + number);
}).catch(e=>{
    console.log("Error: " + e);
});

但是这个同步版本有:

new Promise((resolve, reject)=>{
    throw new Error("uh oh");
}).then(number=>{
    console.log("Number: " + number);
}).catch(e=>{
    console.log("Error: " + e);
});

使用try/catch块和reject清除catch中的错误是执行以下操作的唯一解决方案吗?

new Promise((resolve, reject)=>{
    try {
        setTimeout(()=>{throw new Error("uh oh")}, 1);
    }
    catch(e) {
        reject(e);
    }
}).then(number=>{
    console.log("Number: " + number);
}).catch(e=>{
    console.log("Error: " + e);
});

对于这个问题,假设抛出错误的代码部分位于另一个命名函数中,因此它没有访问reject函数的权限。

谢谢

编辑:这里有一个更完整的示例,说明我想在JSFIDLE中做什么。

共有3个答案

江礼骞
2023-03-14

"对于这个问题,假设抛出错误的代码部分在另一个命名的函数中,所以它不能访问拒绝函数。"-克里斯多夫·什罗巴

"这个(在你的代码中不存在)函数会返回一个promise吗?"-贾芳兰达X

“是的,另一个函数通常返回一个promise,但由于该函数中的异步函数正在抛出错误,所以整个函数正在抛出错误。”–Christopher Shroba

好吧,下次发布你的代码,因为你用英语描述问题的能力永远不会像实际代码那么好。“异步函数”是指返回promise的函数吗?如果是的话。。。

不管你的promise中有多大的错误。下面是一个示例函数three,它调用一个函数two,该函数调用一个函数one,如果JSON格式不正确,则可能引发错误。每一步都对最终的计算做出了有价值的贡献,但是如果one抛出一个错误,它将在整个promise链中冒泡。

js prettyprint-override">const one = (json) => new Promise((resolve, reject) => {
  resolve(JSON.parse(json))
})

const two = (json) => one(json).then(data => data.hello)

const three = (json) => two(json).then(hello => hello.toUpperCase())

three('{"hello":"world"}').then(console.log, console.error)
// "WORLD"

three('bad json').then(console.log, console.error)
// Error: unexpected token b in JSON at position 0
墨星鹏
2023-03-14

没有一种方法可以像第一个示例那样捕获抛出的错误。这里的问题是,您正在使用显式promise构造反模式。您正试图让Promise构造函数完成超出其需要的工作。

相反,您应该promise最少的异步功能,并在此基础上构建。在本例中,这将涉及生成一个promise,在解析之前等待一定时间。大多数第三方promise库已经有了.delay()方法,但创建自己的方法非常容易:

let delay = duration => new Promise(resolve => setTimeout(resolve, duration));

然后,您可以在此基础上构建,并轻松捕获错误:

let delay = duration => new Promise(resolve => setTimeout(resolve, duration));

delay(1)
  .then(() => {
    throw new Error("uh oh");
  })
  .then(number => {
    console.log("Number: " + number);
  }).catch(e => {
    console.log("Error: " + e);
  });
岳劲
2023-03-14

Promise构造函数中使用resolve()reject()。在onRejected.catch()处处理错误。

注意,一旦处理了错误,应到达chained处的oncompleted。然后(),如果有,除非throwonRejected.catch()中使用throw,以明确地将错误传递给chained。然后(\uu,onRejected).catch()

function fn() {
  throw new Error("uh oh")
}

new Promise((resolve, reject) => {
  setTimeout(() => {
    try {
      resolve(fn())
    } catch (e) {
      reject(e)
    }
  }, 1);
}).then(number => {
  console.log("Number: " + number);
}, e => {
  console.log("Error: " + e);
});
 类似资料:
  • 问题内容: 我正在研究节点7异步/等待功能,并不断跨这样的代码绊脚 这似乎是使用异步/等待解决/拒绝或返回/抛出的唯一可能性,但是,v8不会在try / catch块中优化代码吗? 有其他选择吗? 问题答案: 备择方案 替代方法: 显式地使用诺言将是这样的: 或类似的东西,使用延续传递样式: 原始例子 您的原始代码所做的是暂停执行并等待由其返回的诺言解决。然后,它继续执行,并将返回的值写入,如果承

  • 我有以下代码。 然而,它没有捕捉到所有的错误,我仍然得到“throw er//未处理的“错误”事件。 这是为什么呢? 例如,直到我添加了一个特定的错误处理程序,它才捕获parse()函数中的错误。即使不添加,我的try/catch是否应该捕获此错误? 提前致谢!

  • 本文向大家介绍如何捕获 setTimeout 异常相关面试题,主要包含被问及如何捕获 setTimeout 异常时的应答技巧和注意事项,需要的朋友参考一下 No description provided.

  • 我正在尝试使用JavaSeleniumWebDriver捕获网页的所有javascripts错误。 下面是我的代码示例: 作为Firefox驱动程序,我使用的是这个版本:geckodriver-v0。30.0-linux64。焦油广州 以下是我的Selenium版本: 我的问题是,在运行前面的代码时,出现以下异常: 司机信息:司机。版本:组织上的RemoteWebDriver。openqa。硒。j

  • 问题内容: 我在Angular JS接收错误时遇到问题:未捕获的错误:[$ injector:modulerr]。我的JS文件外观 我还包括了angular-route-js Angular文档说问题出在http://docs.angularjs.org/api/ngRoute 问题答案: 尝试添加以下内容:

  • 我想知道是否有一种方法可以在运行自动Selenium测试时捕获页面上的JavaScript错误。