Error handling 如何正确地从由事件网格事件触发的Azure函数返回状态/错误代码

Error handling 如何正确地从由事件网格事件触发的Azure函数返回状态/错误代码,error-handling,azure-functions,azure-eventgrid,Error Handling,Azure Functions,Azure Eventgrid,我正试图了解如何管理由事件网格事件触发的Azure函数中受控和非受控的结果/故障。我确信我遗漏了一些基本方面,但我真的无法理解可用的Microsoft文档 使用当前用于事件网格触发器的Visual Studio 2019 Azure函数模板,我们得到了类似于以下内容的C#方法: [FunctionName("UserCreated")] public static void UserCreated([EventGridTrigger]EventGridEvent evt, ILogger log

我正试图了解如何管理由事件网格事件触发的Azure函数中受控和非受控的结果/故障。我确信我遗漏了一些基本方面,但我真的无法理解可用的Microsoft文档

使用当前用于事件网格触发器的Visual Studio 2019 Azure函数模板,我们得到了类似于以下内容的C#方法:

[FunctionName("UserCreated")]
public static void UserCreated([EventGridTrigger]EventGridEvent evt, ILogger log)
{
    ...
}
问题1。从这些方法返回状态和错误代码的正确方法是什么,以便可以重试事件或将事件传递给死信blob?假设我想返回一个Status 400错误请求,因为传入的事件中的自定义数据负载没有达到最新速度。我试过这个:

[FunctionName("UserCreated")]
public static async Task<IActionResult> UserCreated([EventGridTrigger]EventGridEvent evt, ILogger log)
{
    ...
    return new BadRequestObjectResult("ouch");
}
我不理解这个错误,也不知道如何解决它

问题2。我们如何正确地捕获异常并以有序的方式返回它们?假设上面的UserCreated方法要求传入事件具有几个自定义数据点,并且缺少其中一个数据点。例如,我们有:

    [JsonObject(ItemRequired = Required.Always)]
    private class CustomerAndContactIds
    {
        public int CustomerId { get; set; }
        public int ContactId { get; set; }
    }
。。。当我们转换一些缺失的事件数据时,例如ContactID字段,如下所示:

    private static T ExtractCustomPayloadFromEvent<T>(EventGridEvent evt)
    {
        return JObject.FromObject(evt.Data).ToObject<T>();
    }
然而,我们得到的一切,例如邮递员:

Exception while executing function: UserCreated
对于那些不了解Azure日志流或Azure Insights的消费者来说,什么样的正确方法可以使其更加清晰?

到第1季度:

当前版本的EventGridTrigger函数没有特定的异常对象来处理其包装回HttpStatusCode值。换句话说,azure函数中的任何异常都将在启用时强制执行重试模式

作为解决此问题的一种方法,我们可以使用HttpStatusCode返回值作为订户处理程序的HttpTrigger函数

System.Private.CoreLib: Exception while executing function: UserCreated. Newtonsoft.Json: Required property 'ContactPersonId' not found in JSON. Path ''.
Exception while executing function: UserCreated