【问题标题】:Try Catch unable to catch UnhandledPromiseRejectionWarning尝试 Catch 无法捕获 UnhandledPromiseRejectionWarning
【发布时间】:2018-06-21 17:49:17
【问题描述】:

我认为我有一个很好的发现可以找到我从 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”,以防它因任何原因而失败。 现在它只是因错误而停止并且什么也不做。

【问题讨论】:

    标签: javascript promise puppeteer


    【解决方案1】:

    你正确地catching waitForSelector 和它的链式承诺,但你对 launchnewPage 调用不做同样的事情 - 它们稍后没有连接到 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));
    

    【讨论】:

    • 很好的答案 - 我会试试这个并告诉你:)
    【解决方案2】:

    我给你的提示是,你可以在 Puppeteer 的每个步骤中 catch 错误,因为每个步骤都会返回一个承诺。

    因此,如果您觉得有必要,您可以执行以下操作,而不是 try / catch 块:

    const browser = await puppeteer
      .launch()
      .catch(function (error) {
        /* Handle error here for Puppeteer launch and return
           expected value for browser if things fail */
        console.log(error);
      });
    
    const page = await browser
      .newPage()
      .catch(function (error) {
        /* Handle error here for browser new page and return
           expected value for page if things fail */
        console.log(error);
      });
    

    对我来说,这是在每一步捕获任何预期异常的更简洁的方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-03-16
      • 2010-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-24
      相关资源
      最近更新 更多