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

如何通过WebHook捕获ADF中Runbook在hybrid worker上的执行错误

ADF调用Azure自动化Runbook报错未被捕获的解决方案

问题本质

你当前的脚本逻辑存在执行顺序缺陷:CATCH块中触发错误回调后,没有终止脚本运行,后续的全局回调逻辑会再次调用ADF回调地址,覆盖错误请求发送成功报文,最终导致ADF仅识别到最后一次的成功回调,标记活动执行成功。
同时回调报文结构不符合ADF Webhook活动的错误识别规则,也是错误无法被正确捕获的原因之一。

修复步骤

1. 调整错误回调逻辑,执行完成后直接终止脚本

在CATCH块的回调请求执行完成后添加exit 1,阻止后续代码继续执行,避免成功报文覆盖错误报文。

2. 补充文件存在性前置校验

在上传文件之前先判断本地文件是否存在,不存在则主动抛出错误进入CATCH逻辑。

3. 优化回调报文结构适配ADF规则

ADF Webhook活动识别失败要求:HTTP响应状态码为4xx/5xx,报文中包含error对象;成功请求返回200状态码,可添加output字段避免提示“No output available”。

修复后的完整代码

param(
      [Parameter (Mandatory = $false)]
      [object] $WebhookData
  )
Import-Module Az.Storage -force

$callBackUri = $null
if($WebhookData){
    $parameters=(ConvertFrom-Json -InputObject $WebhookData.RequestBody) 
    if($parameters.callBackUri) {$callBackUri=$parameters.callBackUri}
}
  
TRY
{
    $connectionName = "***************"
    $storageAccountName = "*****************"
    $sasToken = "************************"

    $context = New-AzStorageContext -StorageAccountName $storageAccountName -SASToken $sasToken

    $localFile = "C:\VenaIntegrate\Data\In\"
    $filename = "exporthierarchy" + (Get-Date -format "yyyyMMdd") + ".psv"
    $filename2 = "exportattributes" + (Get-Date -format "yyyyMMdd") + ".psv"
    $path = $localFile + $filename
    $path2 = $localFile + $filename2

    # 新增文件存在性校验
    if(-not (Test-Path -Path $path -PathType Leaf)){
        throw "文件$path不存在"
    }
    if(-not (Test-Path -Path $path2 -PathType Leaf)){
        throw "文件$path2不存在"
    }

    $filesystemName = "******"

    Set-AzStorageBlobContent -File $path -Container $filesystemName -Context $context -Force
    Set-AzStorageBlobContent -File $path2 -Container $filesystemName -Context $context -Force

    # 执行成功回调
    $body = [ordered]@{
        success = @{
            SuccessCode = "Process success"
            Message = "Process completed successfully"
        }
        # 新增output字段,消除ADF无输出提示
        output = @{
            status = "Success"
            message = "文件上传完成"
        }
    }
    $bodyJson = $body | ConvertTo-Json
    Invoke-WebRequest -UseBasicParsing -Uri $callBackUri -Method Post -Body $bodyJson -ContentType "application/json"
}
CATCH {
    Write-Error "Error Occured: $_"
    # 仅当回调地址存在时发送错误通知
    if($callBackUri){
        $body = [ordered]@{
            error = @{
                ErrorCode = "ExecutionFailed"
                Message = $_.Exception.Message
            }
            statusCode = "400"
        }
        $bodyJson = $body | ConvertTo-Json
        Invoke-WebRequest -UseBasicParsing -Uri $callBackUri -Method Post -Body $bodyJson -ContentType "application/json"
    }
    # 终止脚本运行,避免后续逻辑覆盖回调结果
    exit 1
}

# 回调地址为空的错误处理
If (!$callBackUri)
{
    Write-Error "缺少必填参数callBackUri"
    exit 1
}

验证逻辑

修改完成后,测试文件不存在的场景:Runbook会进入CATCH块发送错误回调后直接终止,ADF收到400状态码和错误对象,会自动标记活动为失败,同时展示错误信息。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 19:42:01