Лямбда-ошибки не перехватываются блоками try / catch или обработчиком ошибок - PullRequest
0 голосов
/ 19 декабря 2018

Я пытаюсь регистрировать ошибки в навыке alexa, который запускается в функции Lambda, но независимо от того, что я пытаюсь, ошибки каким-то образом проходят через мои блоки try/catch без регистрации.

Это мойindex.js:

const Alexa = require('ask-sdk-core');

try {
  const handlers = require('./handlers');

  const wrappedHandlers = handlers.map(handler => ({
    ...handler,
    async handle(handlerInput) {
      try {
        console.log(`Running handler ${handler.name}`, JSON.stringify(handlerInput, null, 2));
        const response = await handler.handle(handlerInput);
        console.log(`Successfully ran handler ${handler.name}`, JSON.stringify(response, null, 2));
        return response;
      } catch(error) {
        console.log(`Failed to run handler ${handler.name}`, error.stack);
        throw error;
      }
    },
  }));

  exports.handler = Alexa.SkillBuilders
    .custom()
    .addRequestHandlers(...wrappedHandlers)
    .addErrorHandlers(require('./handlers/error'))
    .lambda();
} catch(error) {
  console.log('Fatal initialization error', error);
  exports.handler = Alexa.SkillBuilders
    .custom()
    .addRequestHandlers({
      canHandle() { return true; },
      handle(handlerInput) {
        return handlerInput.responseBuilder
          .speak(`Initialization error`, error.stack);
      },
    })
    .lambda();
}

Верхний уровень try/catch должен перехватывать любые ошибки, выданные во время require('./handlers').Я наблюдал, как это работало в прошлом, отлавливая синтаксические ошибки в моих обработчиках.

Я также обертываю функцию handle каждого обработчика в try/catch (см. wrappedHandlers).Мой обработчик ошибок также регистрирует любые ошибки, которые он видит:

// handlers/error.js
module.exports = {
  canHandle() { return true; },

  handle(handlerInput, error) {
    console.log(`Error handled: ${error.stack}`);

    // During tests, include the error in the response
    if(process.env['NODE_ENV'] === 'test') {
      const { attributesManager } = handlerInput;
      const sessionAttributes = attributesManager.getSessionAttributes();
      sessionAttributes.error = error;
      attributesManager.setSessionAttributes(sessionAttributes);
    }

    const message = error && error.speachMessage || `Sorry, I can't understand the command. Please say again. ${error.stack}`;
    return handlerInput.responseBuilder
      .speak(message)
      .reprompt(message)
      .getResponse();
  },
};

Несмотря на все это, симулятор Alexa выплевывает [Error]: An unexpected error occurred., но журналы Cloudwatch не содержат ошибок или неудачных запросов.Как это возможно?

...