Я пытаюсь регистрировать ошибки в навыке 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.
, но журналы облачных часов не содержат ошибок или неудачных запросов. Как это возможно?
Это опечатка, но она постоянна во всем, поэтому я не думаю, что это вызывает проблему. Хотя было бы разумно, что ошибка, возникшая в обработчике ошибок, может вызвать эту проблему, поэтому я протестирую это еще немного.
Я также испытываю эту проблему, и у меня есть функция, которая выбрасывает неверный шлюз лямбда 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. Исключения соблюдаются
speachMessage
->speechMessage
?