Azure Functions 的全局异常处理程序

Pav*_*uva 9 azure-functions

是否可以为 Azure Functions .Net C# 项目提供全局异常处理程序?

我们希望有一个集中的地方来记录 Rollbar 的异常。

Pan*_*wat 9

我也在等待测试功能,但现在,我已经编写了用于日志记录/异常处理的方面 (AOP)。我有很多函数,但没有为异常处理编写单个 try-catch。

我正在将MrAdvice用于 AOP

方面

public class LoggerAspectAttribute : Attribute, IMethodAsyncAdvice
{
    public async Task Advise(MethodAsyncAdviceContext context)
    {
        ILog log = LogManager.GetLogger();
        RequestTelemetry requestTelemetry = new RequestTelemetry { Name = context.TargetType.Name };
        IOperationHolder<RequestTelemetry> operation = log.TelemetryClient.StartOperation(requestTelemetry);
        operation.Telemetry.Success = true;
        log.Info($"{context.TargetType.Name} trigger");

        try
        {
            await context.ProceedAsync(); // this calls the original method
        }
        catch (Exception ex)
        {
            operation.Telemetry.Success = false;
            log.Error(ex.Message, ex);
            throw;
        }
        finally
        {
            log.Info($"{context.TargetType.Name} completed.");
            log.TelemetryClient.StopOperation(operation);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

功能

public static class AlertFunction
{
    [LoggerAspect]
    [FunctionName("AlertFunction")]
    public static async Task Run([EventHubTrigger("%AlertEventHub%", Connection = "AlertEventHubConnection", ConsumerGroup = "%AlertEventHubConsumerGroup%")]EventData eventMessage,
        [Inject]IEventService eventService, [Inject]ILog log)
    {
        log.Verbose($"Event PartitionKey {eventMessage.PartitionKey}, Offset {eventMessage.Offset} and SequenceNumber {eventMessage.SequenceNumber}");
        string message = Encoding.UTF8.GetString(eventMessage.GetBytes());
        log.Verbose(message);
        await eventService.FilterAlertEventAsync(message);
    }
}
Run Code Online (Sandbox Code Playgroud)

希望它会给一些想法!


Lev*_*Lev 7

现在可以通过定义您自己的中间件来使用新的进程外(=隔离)模型在这里,在“azure-functions-dotnet-worker”存储库的“samples”文件夹中,我还找到了ExceptionHandlingMiddleware的示例。

不幸的是,相关内容太大,无法将其包含在答案中,但我希望我输入足够的关键字来找到该内容。