我使用Puppeteer库打开一个URL并处理所有请求'响应。有时在事件监听器page.on('response')
内部,我需要抛出一个错误,如下例所示。但是我无法以任何方式捕获这些异常,我总是遇到unhandled promise rejection
错误。我该如何处理这些异常?我不想使用process.on('unhandledRejection')
,因为它根本无法解决我的问题。
const puppeteer = require('puppeteer');
(async () => {
try {
const browser = await puppeteer.launch();
const page = await browser.newPage();
page.on('response', (request) => {
throw 'response error';
});
await page.goto('http://google.com/');
browser.close();
} catch (e) {}
})();
答案 0 :(得分:1)
我永远不会将响应放入事件处理程序中,因为您一定会遇到明确表达的问题,即试图向用户发送多个响应而导致错误(除非您创建一个事件处理程序来管理是否已被调用)之前,然后强迫发送响应,但这也不是很漂亮)。我将使用Promise.race条件。
这将等待您的第一个诺言拒绝或解决。即使您的page.on无法解决问题,因为page.goto应该这样做或拒绝。
所以看起来有点像这样
try {
await Promise.race([
new Promise((res,rej) => page.on('error', error => rej(error))),
page.goto('http://google.com/')
]);
// Do stuff if got succeeds
browser.close();
catch (err) {
// do stuff with your error
browser.close();
}
答案 1 :(得分:0)
尽管page.on
处理函数的功能位于try..catch
块内部,但该函数是异步执行的,因此,该函数内部引发的任何错误都不会被外部try..catch
块捕获
您必须在函数内创建另一个try..catch
块。
示例
const puppeteer = require('puppeteer');
function handleError(err) {
// ...
}
(async () => {
try {
const browser = await puppeteer.launch();
const page = await browser.newPage();
page.on('response', (request) => {
try { // inner try catch block to catch errors inside this function
// ...
throw 'response error';
} catch (err) {
// Handle the error here, or pass it to another function:
handleError(err);
}
});
await page.goto('http://google.com/');
browser.close();
} catch (e) {}
})();
答案 2 :(得分:-1)
要避免该错误,您要做的就是捕获异步函数(即Promise)的结果,并以某种方式处理它,即使只是通过console.error
传递它。
const puppeteer = require('puppeteer');
(async () => {
try {
const browser = await puppeteer.launch();
const page = await browser.newPage();
page.on('response', (request) => {
throw 'response error';
});
await page.goto('http://google.com/');
browser.close();
} catch (e) {}
})().catch(console.error);