Я пытаюсь регистрировать ошибки в навыке 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 не содержат ошибок или неудачных запросов.Как это возможно?