是否可以使用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中做什么。
"对于这个问题,假设抛出错误的代码部分在另一个命名的函数中,所以它不能访问拒绝函数。"-克里斯多夫·什罗巴
"这个(在你的代码中不存在)函数会返回一个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
没有一种方法可以像第一个示例那样捕获抛出的错误。这里的问题是,您正在使用显式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);
});
在Promise
构造函数中使用resolve()
,reject()
。在onRejected
或.catch()
处处理错误。
注意,一旦处理了错误,应到达chained处的
),如果有,除非oncompleted
。然后(throw
在onRejected
或.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错误。