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

Durable Function全局异常处理:如何让监控实例变红并上报错误

解决Durable Function中间件全局异常处理并标记实例为失败状态的方案

核心问题分析

你当前的中间件仅在捕获异常后记录日志,但没有让Durable运行时感知到执行失败——因为吞掉了异常,Durable会默认判定函数执行成功,所以监控里实例状态保持绿色。另外,SetCustomStatus需要通过Durable专属上下文调用,得先从FunctionContext中获取对应上下文对象。

具体实现方案

1. 区分编排器与活动函数的上下文

中间件里要先判断当前执行的是编排器还是活动函数,两者的上下文获取方式不同:

  • 编排器:通过DurableOrchestrationContext获取
  • 活动函数:通过DurableActivityContext获取

2. 正确处理异常并标记实例失败

不能直接吞掉异常,在记录日志、设置自定义状态后,必须重新抛出异常,让Durable运行时识别到执行失败,才能将实例状态标记为红色(失败状态)。

3. 修改后的中间件代码

internal sealed class ErrorHandlerMiddleware(ILogger<ErrorHandlerMiddleware> logger) : IFunctionsWorkerMiddleware
{
    private readonly ILogger<ErrorHandlerMiddleware> _logger = logger ?? throw new ArgumentNullException(nameof(logger));

    public async Task Invoke(FunctionContext context, FunctionExecutionDelegate next)
    {
        try
        {
            await next(context);
        }
        catch (Exception ex)
        {
            _logger.LogError(ex, "Durable函数执行异常");
            
            // 尝试获取编排器上下文并设置自定义错误状态
            if (context.TryGetExtension<DurableOrchestrationContext>(out var orchestrationContext))
            {
                orchestrationContext.SetCustomStatus(new 
                {
                    Status = "Failed",
                    ErrorMessage = ex.Message,
                    StackTrace = ex.StackTrace
                });
            }
            // 尝试获取活动函数上下文并设置自定义错误状态
            else if (context.TryGetExtension<DurableActivityContext>(out var activityContext))
            {
                activityContext.SetCustomStatus(new 
                {
                    Status = "ActivityFailed",
                    ErrorMessage = ex.Message,
                    StackTrace = ex.StackTrace
                });
            }
            
            // 重新抛出异常,让Durable运行时标记实例为失败状态
            throw;
        }
    }
}

关键说明

  • 重新抛出异常:这是实例状态变红的核心操作,不抛出异常的话,Durable会始终认为执行成功。
  • 自定义状态:通过SetCustomStatus附加的错误信息,会显示在Durable监控界面的「自定义状态」栏,方便直接查看异常详情。
  • 上下文获取:用TryGetExtension安全获取Durable上下文,避免强制转换导致的额外异常。

额外注意事项

  • 确保你的Durable Functions版本为v4及以上,该版本支持TryGetExtension方法。
  • 活动函数的异常会触发编排器的错误逻辑(比如重试或ContinueAsNew),如果编排器未捕获该异常,最终会导致整个实例失败并标记为红色。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 23:12:40