You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Invoke-RestMethod针对哪些HTTP状态码会抛出异常?

关于Invoke-RestMethod非2XX状态码的异常行为验证

你的推测基本正确,但有几个关键细节需要明确:

  • 默认行为:在PowerShell的所有版本中,Invoke-RestMethod默认会对所有非2XX类HTTP状态码抛出异常:
    • PowerShell 5.x及更早版本:抛出System.Net.WebException
    • PowerShell 7及以上版本:抛出Microsoft.PowerShell.Commands.HttpResponseException
  • 例外场景: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)"

回退策略建议

  1. 版本兼容方案:如果需要兼容多版本PowerShell,使用try/catch块统一捕获异常,从异常对象中提取状态码后分支处理
  2. PowerShell 7+优化方案:使用-SkipHttpErrorCheck参数,直接获取完整响应,根据StatusCode属性判断执行逻辑,避免异常捕获的冗余代码
  3. 状态码分支处理:针对常见非2XX状态码制定不同策略,比如:
    • 401/403:触发认证流程重试
    • 404:检查请求路径或返回默认数据
    • 500/503:延迟一段时间后重试(注意设置重试次数上限)

内容的提问来源于stack exchange,提问作者Kino101

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 07:52:40