【问题标题】:System.InvalidOperationException not being catched in powershell scriptSystem.InvalidOperationException 未在 powershell 脚本中捕获
【发布时间】:2016-07-07 16:38:47
【问题描述】:

我正在尝试在 powershell 脚本中捕获特定异常。下面的代码块正在尝试这样做,当抛出给定的异常时,脚本应该忽略它:

try
{
    Stop-WebAppPool $webServerSettings.applicationPool
}
catch [System.InvalidOperationException]
{

}

不幸的是,这似乎不起作用,我仍然收到此回复:

Stop-WebAppPool : Object on target path is already stopped.
At F:\Portal.Update.ps1:12 char:2
+     Stop-WebAppPool $webServerSettings.applicationPool
+     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [Stop-WebAppPool], InvalidOperationException
    + FullyQualifiedErrorId : InvalidOperation,Microsoft.IIs.PowerShell.Provider.StopAppPoolCommand

我尝试了几个选项:

  • 将“ErrorAction Stop”参数值传递给命令。现在我没有错误,但脚本停止了,这不是我想要的。
  • 将“ErrorAction SilentlyContinue”参数值传递给命令。但这仅在捕获所有类型的异常时才有效,这是我不想要的,因为如果应用程序池不存在,我希望抛出异常。

更新: 我找到了解决这个问题的方法:只需读出 $_.exception 变量并使用 GetType() 获取真正的异常类型,但在 catch 中使用函数似乎不是正确的方法:

try
{
    Stop-WebAppPool $webServerSettings.applicationPool
}
catch
{
    if ($_.Exception.GetType().Name -eq "InvalidOperationException")
    {       
        return
    }
    throw
}

【问题讨论】:

    标签: powershell exception try-catch


    【解决方案1】:

    试试,

    try
    {
    Stop-WebAppPool $webServerSettings.applicationPool -ErrorAction Stop
    }
    Catch
    {
    "Unable to stop Web App Pool"
    }
    

    -ErrorAction Stop 告诉 PowerShell 在遇到错误时停止;这会抑制您看到的错误输出。

    【讨论】:

    • 这似乎不起作用。我仍然收到异常,消息说抛出的异常是 System.InvalidOperation 异常。
    • 2 秒刚刚发现你回复的其他内容,即将编辑我的答案
    • ErrorAction Stop 也不会在抛出另一种类型的异常时显示信息,这不是我想要的。
    • 在命令中添加“-PassThru”,然后如果您需要在 shell 中显示错误
    猜你喜欢
    • 1970-01-01
    • 2021-04-20
    • 1970-01-01
    • 2018-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多