У меня есть настройка функции Azure, которая.Его триггер настроен на сообщение Service Bus Queue .Когда функция запускается, сообщение обрабатывается каким-либо образом.Если во время обработки возникает какое-либо исключение, я обрабатываю эту ошибку и сохраняю сообщение в хранилище таблиц Azure, установленное в качестве выходной привязки для целей ведения журнала.
Я хочу обрабатывать любые ошибки, возникающие при записи чего-либо в выходную привязку.Как бы я поступил так?
Сведения об ошибке
Одна из ошибок, с которыми я столкнулся во время записи в привязку вывода (хранение таблицы), заключается в том, что значение некоторого ключа не может быть сохранено.Например, один из ключей в сообщении - time
со значением типа число .При записи этих данных я получил исключение, что значение ключа не может вписаться в число Int32
.Я думаю, что хранилище таблиц попыталось преобразовать число в Int32
по умолчанию, но не удалось.Чтобы обойти это, я преобразовал все ключи в строковые значения.Теперь я могу сохранить.
Но все же я хочу обрабатывать любые непредвиденные ошибки при записи в привязку вывода таблицы хранения.
Важна обработка ошибокв этом случае, поскольку если сообщение служебной шины не используется должным образом, то сообщение не удаляется в очереди служебной шины, и после завершения выполнения функции Azure это сообщение снова вызывает функцию, и функция входит в неопределенный цикл.
Ниже приведен пример функции Azure
module.exports = async function (context, mySbMsg) {
try{
// process service bus message
await processMsg(mySbMsg);
} catch(e) {
// if processing fails, save the message in Azure table
try{
// my own try to handle errors, but was unsuccessful
await new Promise(function (resolve, reject) {
context.bindings.tableBinding = [];
context.bindings.tableBinding.push({
PartitionKey: mySbMsg.id|| "unknown",
RowKey: time + "",
errorMessage: e.message || "",
...mySbMsg
})
resolve();
});
} catch (e) {
// do something HERE;
// exception on output binding didn't brought me here
}
}
context.done();
}