Invoke-RestMethod针对哪些HTTP状态码会抛出异常?
关于Invoke-RestMethod非2XX状态码的异常行为验证
你的推测基本正确,但有几个关键细节需要明确:
- 默认行为:在PowerShell的所有版本中,
Invoke-RestMethod默认会对所有非2XX类HTTP状态码抛出异常:- PowerShell 5.x及更早版本:抛出
System.Net.WebException - PowerShell 7及以上版本:抛出
Microsoft.PowerShell.Commands.HttpResponseException
- PowerShell 5.x及更早版本:抛出
- 例外场景:PowerShell 7+新增了
-SkipHttpErrorCheck参数,使用该参数后,命令不会因非2XX状态码抛出异常,而是直接返回响应内容(包括错误信息)和状态码,方便直接处理。
测试验证代码
可以通过以下代码快速验证行为:
# PowerShell 5.x 捕获非2XX异常 try { Invoke-RestMethod -Uri "https://httpstat.us/404" -Method Get } catch { Write-Host "捕获异常类型: $($_.Exception.GetType().Name)" Write-Host "返回状态码: $($_.Exception.Response.StatusCode.value__)" } # PowerShell 7+ 捕获非2XX异常 try { Invoke-RestMethod -Uri "https://httpstat.us/404" -Method Get } catch { Write-Host "捕获异常类型: $($_.Exception.GetType().Name)" Write-Host "返回状态码: $($_.Exception.Response.StatusCode)" } # PowerShell 7+ 跳过异常直接获取响应 $response = Invoke-RestMethod -Uri "https://httpstat.us/404" -Method Get -SkipHttpErrorCheck Write-Host "返回状态码: $($response.StatusCode)"
回退策略建议
- 版本兼容方案:如果需要兼容多版本PowerShell,使用
try/catch块统一捕获异常,从异常对象中提取状态码后分支处理 - PowerShell 7+优化方案:使用
-SkipHttpErrorCheck参数,直接获取完整响应,根据StatusCode属性判断执行逻辑,避免异常捕获的冗余代码 - 状态码分支处理:针对常见非2XX状态码制定不同策略,比如:
- 401/403:触发认证流程重试
- 404:检查请求路径或返回默认数据
- 500/503:延迟一段时间后重试(注意设置重试次数上限)
内容的提问来源于stack exchange,提问作者Kino101
相关产品推荐
相关产品推荐

