即使使用try/catch也会停止执行Powershell异常
我们有一个在管道中执行的powershell脚本,它有一些命令,如果发生任何错误,这些命令都不会停止。我尝试将脚本块放入即使使用try/catch也会停止执行Powershell异常,powershell,azure-pipelines,Powershell,Azure Pipelines,我们有一个在管道中执行的powershell脚本,它有一些命令,如果发生任何错误,这些命令都不会停止。我尝试将脚本块放入try/catch中,但管道仍因错误而停止: 代码如下: try { az network dns record-set txt add-record ` -g $ResourceGroup ` -n "asuid.$DomainName" ` -v $V
try/catch
中,但管道仍因错误而停止:
代码如下:
try {
az network dns record-set txt add-record `
-g $ResourceGroup `
-n "asuid.$DomainName" `
-v $VerificationId `
-z $Zone
$record = az network dns record-set cname create `
-g $ResourceGroup `
-n $DomainName `
-z $Zone `
-o json | ConvertFrom-Json
az network dns record-set cname set-record `
-g $ResourceGroup `
-n $record.name `
-c $Alias `
-z $Zone
}
catch {
Write-Warning "Creating a DNS record was not possible. Consider creating it by hand or review the error:"
Write-Warning $_
}
我知道一些解决方法,比如告诉管道继续出错,或者只是使用-ErrorAction continue
执行cmdLet,但对我来说,这并不能解释为什么我的方法不起作用。至少对于我这个来自C#和其他语言的人来说,如果你不想重述异常,那将是默认的巴哈维奥语
我遗漏了什么概念
编辑1
以下是yaml中任务失败的部分:
-任务:AzureCLI@2
名称:创建\u dns\u记录
displayName:“在DNS区域上为CNAME和TXT创建DNS记录”
投入:
azureSubscription:“某些azure订阅”
脚本类型:“pscore”
scriptLocation:“inlineScript”
inlineScript:|
. $(System.DefaultWorkingDirectory)/cd/NewDNSRecordSet.ps1
新DNSRecordSet`
-资源组“RGU区域”`
-域名“$(域名)”`
-区域“$(dns_区域)”`
-验证ID'$(验证ID)'`
-别名“$(defaultHostName)”验证ID和defaultHostName作为任务CreateInfrastructure.ps1的输出
以下是管道的输出:
正在为“mytest.dev”区域创建DNS记录集。
添加txt记录:asuid.mytest
ResourceNotFoundError:找不到资源组“RGU区域”。
创建CNAME记录:mytest
ResourceNotFoundError:找不到资源组“RGU区域”。
警告:无法创建DNS记录。
##[错误]脚本失败,退出代码:1
为了测试我的假设,我在PowerShell中本地编写了以下代码:
$ErrorActionPreference = 'Stop'
try {
& 'az' @('group', 'show', '--name', 'foo')
Write-Host "in try: $LASTEXITCODE"
}
catch {
$_
Write-Host "in catch: $LASTEXITCODE"
}
我得到输出:
Resource group 'foo' could not be found.
in try: 3
因此,az
命令失败,退出代码为非零,但没有抛出错误。try块执行良好,脚本结束
如果在管道中运行,非零出口代码将导致管道失败。我的建议是为在PowerShell中执行az CLI命令创建某种帮助器方法,验证
$LASTEXITCODE
,然后自己抛出一个错误,以便以后可以捕获它。这3个命令中的哪一个失败?是第一个吗?如果是第一个命令,那么其他两个命令会被执行吗?通常az
命令是幂等的。ony故障是最后一个,因为$record
为空。这是一个空引用异常。我添加了一个if($record)
,但管道仍然会因错误而停止。这是因为$LASTEXITCODE
自动变量。您还应该设置$ErrorActionPreference='Stop'
,但我不想停止,管道应该继续$ErrorActionPreference='Stop'
将使我的管道停止如果设置为Continue/SilentlyContinue
则会引发错误的命令运行正常,这意味着如果try块中有可能引发错误的内容,它将永远不会进入catch块。从我在你的帖子中看到的情况来看,这正是你意想不到的。首先在本地测试您的脚本。这是一个很好的测试。我认为错误在于Azure DevOps中的AzureCLI
任务,因此我不明白AzureCLI任务在幕后做什么。试一试就可以了。我将用yaml部分更新我的线程。