Ошибки лямбда не обнаруживаются блоками try / catch или обработчиком ошибок

Я пытаюсь регистрировать ошибки в навыке 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.info(`Running handler ${handler.name}`, JSON.stringify(handlerInput, null, 2));
        const response = await handler.handle(handlerInput);
        console.info(`Successfully ran handler ${handler.name}`, JSON.stringify(response, null, 2));
        return response;
      } catch(error) {
        console.info(`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.info('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.info(`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., но журналы облачных часов не содержат ошибок или неудачных запросов. Как это возможно?

speachMessage -> speechMessage?
Bergi 19.12.2018 07:37

Это опечатка, но она постоянна во всем, поэтому я не думаю, что это вызывает проблему. Хотя было бы разумно, что ошибка, возникшая в обработчике ошибок, может вызвать эту проблему, поэтому я протестирую это еще немного.

SimpleJ 19.12.2018 17:55
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
2
1 642
1

Ответы 1

Я также испытываю эту проблему, и у меня есть функция, которая выбрасывает неверный шлюз лямбда 502, запись журнала cloudwatch содержит

Invoke Error {"errorType":"UnauthorizedError","errorMessage":"Forbidden","name":"UnauthorizedError","stack":["UnauthorizedError: Forbidden"," at /var/task/ApiServerClass.js:57:27"," at processTicksAndRejections (internal/process/task_queues.js:97:5)"," at async module.exports.me (/var/task/ApiServerClass.js:68:43)"," at async module.exports.run (/var/task/ApplicationClass.js:42:22)"]}

Но вся эта функция - это try/catch.

Это как если бы выброс исключения немедленно приводит к завершению лямбда-выражения, и вся ваша обработка исключений игнорируется. Но при запуске локальных тестов через mocha. Исключения соблюдаются

Другие вопросы по теме