代码之家  ›  专栏  ›  技术社区  ›  scharette

使用-errorAction停止标志时捕获最后一个内部异常

  •  1
  • scharette  · 技术社区  · 8 年前

    代码如下:

    Try{
        $connection = Test-Connection -BufferSize 32 -Count 1 -ErrorAction Stop -ComputerName "test"
        return $connection.StatusCode.ToString()
    }
    Catch [System.Net.NetworkInformation.PingException]{
        return "Ping Exception"
    }
    Catch [Exception]{
        return "Unexpected exception"
    }
    

    -ComputerName 找不到,这会让我 System.Net.NetworkInformation.PingException . 但是,在上面的代码中,输出将是 Unexpected exception .

    参考 this 回答,我应该用 System.Management.Automation.ActionPreferenceStopException 抓住它。

    现在我的问题是,当使用 -ErrorAction Stop 旗帜。我应该扔一个 PingException ?这似乎不是个好主意,因为我不能确定 PinException 真的是 ErrorAction 触发。

    1 回复  |  直到 8 年前
        1
  •  1
  •   scharette    8 年前

    当使用时 -ErrorAction Stop 标志,非终止错误将作为类型包装和抛出 System.Management.Automation.ActionPreferenceStopException . 因此,一个解决方案是通过 异常树 像这样,

    Try{
        $connection = Test-Connection -BufferSize 32 -Count 1 -ErrorAction Stop -ComputerName "test"
        return $connection.StatusCode.ToString()
    }
    Catch [System.Management.Automation.ActionPreferenceStopException]{
        $exception = $_.Exception
        #Walk through Exception tree
        while ($exception.InnerException) {
          $exception  = $exception.InnerException
        }
        #Return only the last inner exception
        return $exception.Message
    }
    Catch [Exception]{
        return "Unexpected exception"
    }
    

    编辑

    注意,我的代码返回了最后一个内部异常 消息 作为一根绳子。如果需要,也可以使用相同的逻辑来查找其他信息。

    推荐文章