如何捕获并处理Azure CLI中az rest命令返回的错误响应
核心问题原因
az是外部可执行程序,PowerShell默认的try/catch仅捕获原生PowerShell异常,不会响应外部命令的错误状态- 直接赋值仅捕获
az的标准输出流,错误输出默认直接打印到控制台,不会存入变量 - 外部命令的执行状态需要通过内置变量
$LASTEXITCODE判断
方案1:通用兼容方案(适配所有PowerShell版本)
通过错误流重定向+退出码判断实现捕获,修改后代码如下:
try { # 2>&1 将标准错误流合并到标准输出流,错误内容会存入$rv不会直接打印 $rv = az rest --method post --url "https://graph.microsoft.com/v1.0/servicePrincipals/$DELIBERATE_ERROR" 2>&1 # az执行成功时$LASTEXITCODE为0,非0代表执行出错 if ($LASTEXITCODE -ne 0) { # 手动抛出异常触发catch块 throw "az命令执行失败,错误信息:$rv" } Write-Host "rv:" $rv } catch { Write-Host "error:" $_ }
方案2:高版本PowerShell简化方案(仅PowerShell 7.3+支持)
开启PowerShell对外部命令错误的自动抛出配置,不需要手动判断退出码:
# 开启外部命令非0退出码自动触发错误的配置 $PSNativeCommandUseErrorActionPreference = $true $ErrorActionPreference = 'Stop' try { $rv = az rest --method post --url "https://graph.microsoft.com/v1.0/servicePrincipals/$DELIBERATE_ERROR" 2>&1 Write-Host "rv:" $rv } catch { Write-Host "error:" $_ }
方案3:结构化解析错误信息
配合az命令的JSON输出参数,可直接解析错误详情:
$rv = az rest --method post --url "https://graph.microsoft.com/v1.0/servicePrincipals/$DELIBERATE_ERROR" --output json 2>&1 if ($LASTEXITCODE -ne 0) { # 将错误内容转为JSON对象直接提取字段 $errorObj = $rv | ConvertFrom-Json Write-Host "错误码:$($errorObj.error.code)" Write-Host "错误信息:$($errorObj.error.message)" Write-Host "请求ID:$($errorObj.error.innerError.'request-id')" }
内容的提问来源于stack exchange,提问作者ubienewbie
相关产品推荐
相关产品推荐

