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

xcitsw88  于 2023-05-06  发布在  Node.js
关注(0)|答案(1)|浏览(99)

我对在puppeteer中添加page listeners的必要性(或其他)感到有点困惑,以便捕获所有错误。
在下面的代码片段中,我为'error''pageerror'事件添加了处理程序。但是这些不会被await page.goto()周围的try/catch捕获吗?try/catch捕获了哪些处理程序没有捕获的内容,反之亦然?如果处理程序对try/catch未捕获的错误做出React,那么如何在不获取uncaughtException的情况下正确处理这些错误,因为这些错误发生在正常的async/await流之外?我真的希望对所有错误都使用相同的错误处理逻辑……即await所有错误,并以相同的方式处理 * 任何 * 错误,而不仅仅是其中的一些错误。

(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('https://www.example.com');
        await page.screenshot({ path: './tmp/example.png' });
        await browser.close();
    } catch (err) {
        console.error('Try/catch error:', err);
    }
})();

我试着将整个东西 Package 在new Promise((resolve, reject) => { ... })中,然后在页面错误处理程序中调用reject(error)

try {
    await new Promise((resolve, reject) => {
        (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);
                    reject(error);
                });
                page.on('pageerror', error => {
                    console.error('Page on pageerror:', error);
                    reject(error);
                });
                await page.goto('https://www.example.com');
                await page.screenshot({ path: './tmp/example.png' });
                await browser.close();
                resolve();

            } catch (err) {
                reject(err);
            }
        })();
    });
} catch (err) {
    console.error('Try/catch error:', err);
}

但是我仍然得到一些奇怪的uncaughtException错误(在我的真实的代码中,我还不能在一个简单的例子中重现)...我不知道new Promise()方法在这种情况下是否完全错误。或者正确的方法是什么。

yzuktlbb

yzuktlbb1#

这个请求是一个bit unusual,这表明有了更多的信息,可以提出更好的解决方案,但是如果你想在Node中基于page.on处理程序抛出错误,你可以承诺这些处理程序,并在处理程序被触发时使用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();
  }
})();

相关问题