11

我使用 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) {}
})();
4

3 回答 3

4

尽管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) {}
})();
于 2019-05-03T18:12:46.247 回答
1

我永远不会将响应放在事件处理程序中,因为您肯定会遇到 express 尝试向用户发送多个响应导致错误的问题(除非您创建一个事件处理程序来管理它是否在之前和之后被调用过禁止发送响应,但这也不漂亮)。我会使用 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();
}
于 2020-02-04T15:47:26.787 回答
-3

为避免该错误,您需要做的就是捕捉异步函数的结果,这是一个 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);
于 2018-08-31T17:02:11.577 回答