#azure #powershell #azure-functions
#лазурный #powershell #azure-функции #azure
Вопрос:
Я пытаюсь создать простой оператор try-catch, подобный следующему, но этот блок catch никогда не выполняется
try {
Push-OutputBinding -ErrorAction Stop -Name outputQueueItem -Value $Object
}
catch {
Write-Error "Catching Error"
# code to catch the error
}
Проблема в том, что функция azure не выдает ожидаемую ошибку как завершающую, помимо того факта, что у меня был ErrorAction Stop
параметр. Поэтому catch
код никогда не выполняется.
Журнал вывода:
[8/18/2020 9:42:11 PM] INFORMATION: 00:00:09.9511800
[8/18/2020 9:42:11 PM] Executed 'Functions.Monitor' (Failed, Id=6bf398bd-de2b-460f-a44b-db9838feff3f)
[8/18/2020 9:42:11 PM] System.Private.CoreLib: Exception while executing function: Functions.Monitor. Microsoft.WindowsAzure.Storage: Messages cannot be larger than 65536 bytes.
Ошибка была ожидаемой, однако блок кода catch так и не был выполнен.
Информация о времени выполнения:
Azure Functions Core Tools (3.0.2630 Commit hash: beec61496e1c5de8aa4ba38d1884f7b48233a7ab)
Function Runtime Version: 3.0.13901.0
Я также пытался изменить переменную $ErrorActionPreference = "Stop"
, но это тоже не сработало.
Комментарии:
1. Если
$ErrorActionPreference = 'Stop'
thenWrite-Error "Catching Error"
собирается прервать выполнениеcatch
блока, избегайте ошибок внутри него (по крайней мере, до тех пор, пока вы не закончите обработку ошибок)2. @MathiasR.Jessen Кстати, ваша ссылка на бронирование-com для карьеры мертва 😉
3. @MathiasR.Jessen спасибо за вклад, я этого не знал. Однако в приведенном выше примере кода этого не должно произойти, поскольку ErrorAction останавливается только на уровне команды, а $ErrorActionPreference имеет значение continue и не выводит ошибку внутри catch
4. @ErickGuillen Правильно, это не должно влиять на
Continue
в качестве переменной предпочтения — но я подозреваю, что, возможно, запускатель сценария функции Azure может реагировать на выданную ошибку и прерывать выполнение? Это предположение, но, может быть, стоит попробовать?5. @MathiasR.Jessen Я просто попробовал. Даже с
$ErrorActionPreference = 'Stop'
она продолжает выполнение после генерации кода ошибки в функции try и никогда не запускает catch. Я думаю, может быть, что-то странное происходит с Azure Function Runner
Ответ №1:
Ваш скрипт не может перехватить это исключение, потому что это происходит после завершения сценария. Push-OutputBinding
Команда напрямую не записывает данные в хранилище Azure. Вместо этого она просто сохраняет его во внутренней структуре данных, а фактическая запись в хранилище Azure происходит после завершения функции.
Смотрите также: https://github.com/Azure/azure-functions-powershell-worker/issues/284
Обходной путь заключается в изменении вашего скрипта на прямую запись в хранилище Azure вместо вызова Push-OutputBinding
, чтобы вы могли реализовать собственную обработку ошибок.