在木偶侦听器page.on的回调之外捕获错误

时间:2019-04-17 11:45:04

标签: javascript node.js callback puppeteer

在使用puppeteer进行端到端测试时出现以下问题。

我尝试在页面侦听器之外捕获引发的错误。不幸的是,它不能在page.on(操纵符)侦听器的回调之外访问。

(async () => {
  try {   
// http error handling
    page.on('response', response => {
      if (!response.ok() && response.request().resourceType() === 'xhr')
        throw new Error('HTTP Error occurred');
    });
  } catch (err) {
    // want to catch error here
    console.log('error while running end-2-end test');
    process.exit(1);
  }
})();

我只登录UnhandledPromiseRejectionWarning

2 个答案:

答案 0 :(得分:1)

使用EventEmitter

您可以在eventEmitter上创建一个实例,该实例将侦听某些错误或自定义事件。

// create your own error catching event
const events = require('events');
const catchErrors = new events.EventEmitter();
catchErrors.on('error', (err) => console.error(err));

稍后,

page.on('response', response => {
      if (!response.ok() && response.request().resourceType() === 'xhr')
        catchErrors.emit('error', new Error('HTTP Error occurred'));
});

捕获所有错误

process.on('unhandledRejection', error => {
  console.log('unhandledRejection', error.message);
});

答案 1 :(得分:1)

这是异步代码的常见问题。尽管您的代码看起来像是在try-catch块中引发了异常,但是您赋予page.on函数的函数将在以后运行,因此不会捕获抛出的任何错误。

因此,必须将try-catch块移入函数中(如果throw new Error仅是示例代码)。如果需要,您仍然可以从catch块内部在外部范围内调用函数。另外,您可以删除throw语句并直接调用handleError函数。

function handleError(err) {
    // handle the error
}

page.on('response', response => {
    try {
        if (!response.ok() && response.request().resourceType() === 'xhr') {
            throw new Error('HTTP Error occurred');
        }
    } catch (err) {
        handleError(err);
    }
});