如何在事件监听器中捕获异常?

pro*_*ngo 6 node.js ecmascript-6 es6-promise puppeteer

我使用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) {}
})();
Run Code Online (Sandbox Code Playgroud)

Tho*_*orf 5

尽管处理程序的函数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) {}
})();
Run Code Online (Sandbox Code Playgroud)


小智 -3

为避免该错误,您所需要做的就是捕获 async 函数的结果(即 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);
Run Code Online (Sandbox Code Playgroud)