我对在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()
方法在这种情况下是否完全错误。或者正确的方法是什么。
1条答案
按热度按时间yzuktlbb1#
这个请求是一个bit unusual,这表明有了更多的信息,可以提出更好的解决方案,但是如果你想在Node中基于
page.on
处理程序抛出错误,你可以承诺这些处理程序,并在处理程序被触发时使用Promise.race
停止主线Puppeteer自动化。下面是一个例子: