最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

我们是否需要在 puppeteer 中添加错误和页面错误处理程序,或者 trycatch 是否足够?

网站源码admin41浏览0评论

我们是否需要在 puppeteer 中添加错误和页面错误处理程序,或者 try/catch 是否足够?

我们是否需要在 puppeteer 中添加错误和页面错误处理程序,或者 try/catch 是否足够?

我对在 puppeteer 中添加 page listeners 的需要(或以其他方式)感到有些困惑,以便捕获所有错误。

在下面的代码片段中,我添加了

'error'
'pageerror'
事件的处理程序。但是这些不会被
try/catch
周围的
await page.goto()
抓住吗?
try/catch
捕获的是什么,但没有被处理程序捕获,反之亦然?如果处理程序对
try/catch
未捕获的错误做出反应,我该如何正确处理这些错误而不会得到
uncaughtException
,因为这些错误发生在正常的
async/await
流程之外?我真的想对all错误使用相同的错误处理逻辑......即
await
所有错误,并以相同的方式处理any错误,而不仅仅是其中的一些错误。

(async () => {
    try {
        const browser = await puppeteer.launch({ headless: true, args: ['--no-sandbox'] });
        const page = await browser.newPage();
        page.on('error', error => {
            console.error('Page on error:', error);
        });
        page.on('pageerror', error => {
            console.error('Page on pageerror:', error);
        });
        await page.goto('');
        await page.screenshot({ path: './tmp/example.png' });
        await browser.close();
    } catch (err) {
        console.error('Try/catch error:', err);
    }
})();

我已经尝试将整个内容包装在一个

new Promise((resolve, reject) => { ... })
中,然后在页面错误处理程序中调用
reject(error)
,但我仍然遇到一些奇怪的
uncaughtException
错误(在我的真实代码中,我还无法重现在一个简单的例子中)......我无法弄清楚
new Promise()
方法在这种情况下是否完全错误......或者正确的方法是什么。

回答如下:

这个请求有点不寻常,表明可以通过更多信息提出更好的解决方案,但是如果你想在基于

page.on
处理程序的 Node 中抛出错误,你可以承诺这些处理程序并使用
Promise.race
如果处理程序被触发,则停止主线 Puppeteer 自动化。这是一个例子:

const puppeteer = require("puppeteer"); // ^19.11.1

const html = `<!DOCTYPE html><script>throw Error("hello world");</script>`;

(async () => {
  let browser;
  try {
    browser = await puppeteer.launch();
    const [page] = await browser.pages();
    const error = new Promise((resolve, reject) => {
      page.once("error", reject);
      page.once("pageerror", reject);
    });
    await Promise.race([
      error,
      (async () => {
        await page.setContent(html);
        await page.screenshot({path: "should_not_be_created.png"});
      })(),
    ]);
  }
  catch (err) {
    console.error(err.message); // => Error: hello world
  }
  finally {
    await browser?.close();
  }
})();
发布评论

评论列表(0)

  1. 暂无评论