Функция Azure не выдает завершающих ошибок с помощью Stop ErrorAction в Push-OutputBinding

#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' then Write-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 , чтобы вы могли реализовать собственную обработку ошибок.