错误和页面错误处理程序,或者 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();
}
})();
更多推荐
我们是否需要在 puppeteer 中添加错误和页面错误处理程序,或者 try/catch 是否足够?
发布评论