0

我正在使用Azure 实例元数据服务API。这仅适用于 Azure VM,这很好,但我需要一些错误处理。麻烦的是,当我在我的开发笔记本电脑(高度锁定的环境)上运行它时,我得到了我们的公司代理阻止页面,而我尝试的任何操作(没有双关语)都不会捕获阻止页面并因此处理错误。

就像代理在Invoke-RestMethod可以做任何事情之前拦截了请求。

有什么办法可以捕捉到阻塞消息?

try
{
    $oRequest = Invoke-RestMethod -Headers @{"Metadata"="true"} -Method GET -Uri "http://169.254.169.254/metadata/instance?api-version=2020-06-01"
}
catch [System.Net.WebException]
{
    Throw "An error has occurred: $($_.exception.Message)"
}

$oRequest是空的,甚至管道Out-Null也不会停止代理阻止页面消息。

我很感激在我的公司环境之外很难排除故障,但我希望有人可能经历过这种行为并有办法捕获错误。

我能想到的最好的方法是测试是否$oRequest为空并处理它,但这似乎不正确,它仍然在 PS 控制台中显示阻止消息。

PowerShell 版本 7

TI A

4

1 回答 1

0

好吧,您收到错误的原因是因为您正在捕获原始错误,然后使用throw. 你已经抓住了它,不需要再抛出一个错误。您无法通过管道throw传输到,out-null因为没有任何内容可以发送到管道。

此外,尽管可能并非始终都需要,但最好-ErrorAction Stop在您希望捕获错误的 cmdlet 上进行操作。

try
{
    #This is where the exception will be thrown
    $oRequest = Invoke-RestMethod -Headers @{"Metadata"="true"} -Method GET -Uri "http://169.254.169.254/metadata/instance?api-version=2020-06-01" -ErrorAction Stop
}
catch [System.Net.WebException] #this catches the error that was thrown above and applies it to the built-in variable $_ for the catch's scope
{
    #if you uncomment the throw line, notice how you don't reach the next line,
    #this is because it creates a terminating error, and it's not handled with a try/catch
    #throw "bananas"
    $banana = "An error has occurred: $($_.exception.Message)"
}
Write-Host $banana
于 2020-10-08T23:00:30.047 回答