PowerShell не может найти тип исключения в блоке try / catch

Я использую приложение-функцию PowerShell (~3), которое использует Az модуль PowerShell для управления учетной записью хранения. Если какая-либо из выполняемых мной операций приводит к ошибке, я не могу проверить конкретные типы в блоке _3 _ / _ 4_.

Важно отметить, что там, где нет ошибки, операции с использованием модуля Az.Storage выполняются успешно.

Например, если бы я попытался удалить контейнер, который не существует, приведенный ниже пример приведет к следующей ошибке:

Не удалось найти тип [Microsoft.WindowsAzure.Commands.Storage.Common.ResourceNotFoundException].

Чтобы получить тип возвращаемого исключения, я использую $_.Exception.GetType().fullname.

Я также попытался добавить в сценарий пространство имен, которое может вызывать исключения.

using namespace Microsoft.WindowsAzure.Commands.Storage.Common

Пример

Class Storage
{
    [AppSettings]$AppSettings = [AppSettings]::GetInstance()
    [Object]$Context

    Storage()
    {
        $key = Get-AzStorageAccountKey -ResourceGroupName $this.AppSettings.StorageAccountResourceGroup -Name $this.AppSettings.StorageAccountName
        $this.Context = New-AzStorageContext -StorageAccountName $this.AppSettings.StorageAccountName -StorageAccountKey $key[0].Value
    }

    [void] DeleteBlobContainer([String]$name)
    {
        try {
            Remove-AzStorageContainer -Name $name -Context $this.Context -Force -ErrorAction Stop
        }
        catch [Microsoft.WindowsAzure.Commands.Storage.Common.ResourceNotFoundException] {
            throw [ContainerNotFoundException]::new($name)
        }
        catch {
            throw [DustBinException]::new($_.Exception.Message)
        }
    }
}

Обновлять

При вызове функции, запускаемой HTTP, я вижу, что модуль Az.Storage установлен. Это ожидается, учитывая успешные операции, для которых требуется модуль -

Get-Module -Name Az.Storage -ListAvailable | Select-Object Name, Version, ModuleBase | ConvertTo-Json
[
  {
    "Name": "Az.Storage",
    "Version": {
      "Major": 3,
      "Minor": 0,
      "Build": 0,
      "Revision": -1,
      "MajorRevision": -1,
      "MinorRevision": -1
    },
    "ModuleBase": "C:\\Users\\dgard\\AppData\\Local\\AzureFunctions\\DustBin\\ManagedDependencies\\201202095548376.r\\Az.Storage\\3.0.0"
  }
]

Однако, если скопировать модуль в . \ Bin и включить манифест модуля, чтобы потребовать Microsoft.Azure.Storage.Common.dll, как предлагается в этот вопрос, тип по-прежнему не найден.

New-ModuleManifest ./Modules/StorageHelper/StorageHelper.psd1 -RootModule StorageHelper.psm1 -RequiredAssemblies .\bin\Az.Storage\3.0.0\Microsoft.Azure.Storage.Common.dll

Чтобы быть уверенным, что я добавляю правильную сборку, я обновил манифест, чтобы включить каждую сборку в модуль Az.Storage, но тип по-прежнему не найден.


person David Gard    schedule 03.12.2020    source источник
comment
Это ResourceNotFoundException. Еще не пробовал. Но я надеюсь, что вы сможете это получить.   -  person Ranadip Dutta    schedule 03.12.2020
comment
Исключение тип является общедоступным, поэтому ваш симптом любопытен. Что происходит, когда вы выполняете [Microsoft.WindowsAzure.Commands.Storage.Common.ResourceNotFoundException] автономно? Субоптимальным обходным решением было бы провести сравнение строк на $_.Exception.GetType().ToString() в одном универсальном блоке catch.   -  person mklement0    schedule 03.12.2020
comment
Является ли этот код частью определения class?   -  person Mathias R. Jessen    schedule 04.12.2020
comment
@ MathiasR.Jessen, да, это так. Я не понимал, что это будет иметь значение - я обновлю пример в своем вопросе.   -  person David Gard    schedule 04.12.2020
comment
@DavidGard, можете ли вы попробовать установить последнюю стабильную версию Az.Storage 3.0.0? Я использую его, и ваш код может работать хорошо.   -  person Ivan Yang    schedule 07.12.2020
comment
@IvanYang - у меня уже установлена ​​3.0.0. Я обновлю свой вопрос, чтобы сделать его более очевидным.   -  person David Gard    schedule 07.12.2020


Ответы (1)


В моем вопросе я добавил обновление, в котором упоминалось, что я пытался добавить манифест модуля, требующий всех Az.Storage сборок; это было не совсем правильно ...

Я скопировал список необходимых сборок из манифеста модуля, включенного в модуль Az.Storage, но он не включал Microsoft.Azure.PowerShell.Cmdlets.Storage.dll. Использование манифеста модуля для требования этой сборки (только этой, других не требуется) сработало.

New-ModuleManifest ./Modules/StorageHelper/StorageHelper.psd1 -RootModule StorageHelper.psm1 -RequiredAssemblies .\bin\Az.Storage\3.0.0\Microsoft.Azure.PowerShell.Cmdlets.Storage.dll 
person David Gard    schedule 22.12.2020