首页 > 解决方案 > Http 触发的 azure 函数中的异常处理 - 更好地控制 JSON 内容响应

问题描述

我想知道在 Http 触发的 azure 函数中处理异常的一个好习惯——详细来说我想知道在出现未处理异常的情况下的标准输出——它会产生 HTTP 错误状态 500 和一个关于详细错误消息和 errorCode 的 JSON 正文

它是关于 azure functions v1 - .NET 4.6.1 - VS 2017 中的一个装配项目(我不确定 v2 中的情况 - 它可能会有所不同)

波纹管是带有消息“Test1”(以及内部异常“Test2”的抛出(未处理)异常的响应主体的示例

{
    "id": "942e63a9-6c47-425a-94da-247297953035",
    "requestId": "fa2d2bd9-8e9e-49eb-8751-b023f3a87f73",
    "statusCode": 500,
    "errorCode": 0,
    "message": "Exception while executing function: CheckSite -> Test1 -> Test2",
    "errorDetails": "Microsoft.Azure.WebJobs.Host.FunctionInvocationException : Exception while executing function: TestSite ---> System.Exception : Test1 ---> System.Exception : Test2 \r\n   End of inner exception\r\n   at async TestSite.Check..."
}

还添加了一个代码示例:

public static async Task<HttpResponseMessage> Run([HttpTrigger(AuthorizationLevel.Function, "get", Route = null)] HttpRequestMessage req, TraceWriter log, ExecutionContext execCtx)
{
    try
    {
        // a business logic
        // ...
        throw new Exception("something wrong with internal data", new Exception("something inner wrong with internal data2"));
        // ...
    }
    catch (Exception ex)
    {
        var correlationId = Guid.NewGuid().ToString();
        log.Error($"Exception: correlationId: {correlationId}, type: {ex.GetType().Name} : {ex.Message}");
        log.Error($"Exception: correlationId: {correlationId}, stack: {ex.StackTrace}");
        return HttpUt.ErrResponse(HttpStatusCode.InternalServerError, "unexpected error", correlationId);
    }       
}

我的目标是拦截具有某些较高级别和相关 ID 的“低级别详细消息”消息。仅在 Run 方法上使用全局 try-catch 块并抛出具有相关 ID 的新异常(并记录原始异常)几乎是成功的

与完全控制内容的返回 HttpResponseMessage(errStatusCode) 相比,抛出新异常似乎更好,因为它使 azure 函数“成功”失败:) 并且记录了该失败。但是是否有可能如何更好地控制 JSON 主体以应对该故障 - 例如在 JSON 主体中有自己的 errorCode 值或其他自定义项?

(解决方案可能会以某种方式使函数失败甚至返回 HttpResponseMessage(errStatusCode),但我不知道该怎么做)我还想知道在 azure fn v2 中是否有解决该问题的方法?

标签: httpazure-functions-runtime.net-4.6.1

解决方案


推荐阅读