首页 > 解决方案 > 尝试 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”以防它因任何原因而失败。现在它只是因错误而停止并且什么也不做。

标签: javascriptpromisepuppeteer

解决方案


您正在正确地使用catchthewaitForSelector和它的链式承诺,但是您对launchandnewPage调用并没有做同样的事情 - 它们没有连接到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));

推荐阅读