javascript - 尝试 Catch 无法捕获 UnhandledPromiseRejectionWarning
问题描述
我认为我有一个很好的发现可以找到我从 puppeteer 那里得到的那些罕见的超时,但是有些超时没有被它们中的任何一个捕获 - 我的问题是为什么?
这是代码:
var readHtml = (url) => {
return new Promise( async (resolve,reject)=> {
var browser = await puppeteer.launch()
var page = await browser.newPage()
await page.waitForSelector('.allDataLoaded')
.then(() => {
console.log ("Finished reading: " + url)
return resolve("COOL");
})
.catch((err) => {
console.log ("Timeout or other error: ", err)
return resolve("TRYAGAIN");
});
})}
这是错误....
(node:23124) UnhandledPromiseRejectionWarning: Error: Navigation Timeout Exceeded: 30000ms exceeded at Promise.then
(node:23124) UnhandledPromiseRejectionWarning:
Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 2)
我做了一些研究,这可能是因为 puppeteer newPage() 中有一些 url 尚未完成
但是我的 .catch 怎么不咳嗽呢?
我需要它“TRYAGAIN”以防它因任何原因而失败。现在它只是因错误而停止并且什么也不做。
解决方案
您正在正确地使用catch
thewaitForSelector
和它的链式承诺,但是您对launch
andnewPage
调用并没有做同样的事情 - 它们没有连接到catch
后者。
因为异步函数已经自动返回 Promise,你可以考虑完全避免使用 Promise 构造函数:
var readHtml = async (url) => {
try {
var browser = await puppeteer.launch()
var page = await browser.newPage()
} catch(e) {
// handle initialization error
}
await page.waitForSelector('.allDataLoaded')
.then(() => {
console.log ("Finished reading: " + url)
return resolve("COOL");
})
.catch((err) => {
console.log ("Timeout or other error: ", err)
return resolve("TRYAGAIN");
});
}
或者,您可以考虑将以下内容catch
放入消费者readHtml
:
var readHtml = async (url) => {
var browser = await puppeteer.launch()
var page = await browser.newPage()
await page.waitForSelector('.allDataLoaded')
console.log ("Finished reading: " + url)
};
readHtml(someurl)
.catch((e) => console.log('err: ' + e));
推荐阅读
- c - C语言中的字节顺序和移位运算符,我做对了吗?
- python - 设置 python 时无法使用特定的 gcc 版本
- c# - 将 NULL 值从数据库映射到对象的属性
- reactjs - 下一个 js 获取在 componentdidmount 上失败
- elasticsearch - 在弹性搜索过滤器中实现 Array.Except(Array2) > 0 查询?
- python - numpy 中的条件。如何使用 pandas 或 numpy 将 3 个或更多放入我的数据框中?
- xamarin - 如何更改 Xamarin Forms 中导航栏标题区域的字体大小?
- json - 仅在 JSON 之后加载 tableView
- uml - UML 状态图中是否允许没有直接转换的状态?
- android - 未找到 Azure Jenkins Android SDK