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

时间:2017-09-18 12:26:54

标签: 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) {}
})();

3 个答案:

答案 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);