PowerShell 无法在 try/catch block 中找到异常类型

标签 powershell exception types azure-powershell azure-function-app

我正在运行一个 PowerShell 函数应用程序 (~3),它使用 Az PowerShell 模块来管理存储帐户。如果我执行的任何操作导致错误,我将无法在 try/catch block 中检查特定类型。

请务必注意,如果没有错误,则使用 Az.Storage 模块的操作会成功。

例如,如果我尝试删除一个不存在的容器,下面的示例会导致以下错误 -

Unable to find type [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 并包含模块 list 以要求 Microsoft.Azure.Storage.Common.dll,如 this question 中的建议, 仍然找不到类型。

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

为确保我添加了正确的程序集,我更新了 list 以将每个程序集都包含在 Az.Storage 模块中,但仍未找到该类型。

最佳答案

在我的问题中,我添加了一个更新,提到我曾尝试添加一个需要所有 Az.Storage 程序集的模块 list ;这不太正确...

我从 Az.Storage 模块随附的模块 list 中复制了所需程序集的列表,但这不包括 Microsoft.Azure.PowerShell.Cmdlets.Storage.dll。使用模块 list 要求此程序集(仅此一个,不需要其他程序集)已奏效。

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

关于PowerShell 无法在 try/catch block 中找到异常类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65128669/

相关文章:

c++ - 类和类型的问题

php - Laravel迁移数组类型(数据库列存储数组)

powershell - 在 PowerShell 中压缩目录时出现 Remove-Item 错误

powershell - 如何在 Azure VM 上对 Azure Powershell 进行身份验证

exception - 捕捉导出(1);

java - 为什么我可以查看某些异常的实时调用堆栈,而不能查看其他异常的实时调用堆栈?

c++ - 自动初始化列表的类型

Powershell,内置的集合交叉点?

powershell - 后台作业过早结束

java - Intellij Idea 不断给出 JDOMParseException 错误