Обработка исключений в Http-инициируемой функции Azure - лучший контроль ответа на контент JSON - PullRequest
0 голосов
/ 06 июня 2019

Мне интересно узнать о хорошей практике обработки исключений в функциях Azure, запускаемых по протоколу Http. Подробно мне интересно узнать о стандартном выводе в случае необработанного исключения: он выдает статус ошибки HTTP 500 и тело JSON с подробным сообщением об ошибке иerrorCode

Речь идет о функциях Azure 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);
    }       
}

Моя цельон должен был перехватывать сообщения «подробные сообщения низкого уровня» с некоторым верхним уровнем и с идентификатором корреляции. Он был почти успешным только с глобальным блоком try-catch для метода Run и с выдачей нового исключения с идентификатором корреляции (и протоколированиеморигинал)

Создается новое исключение, по-видимому, лучше, чем возвращение HttpResponseMessage (errStatusCode) с содержимым под полным контролем, потому что это делает функцию Azure "успешно" не удалась :), и этот сбой регистрируется.Но есть ли возможность, как лучше контролировать тело JSON для этого сбоя - например, иметь собственное значение errorCode или дополнительные пользовательские элементы в теле JSON?

(Решение может заключаться в том, чтобы каким-то образом сделать возвращение сбоя функциидаже HttpResponseMessage (errStatusCode), но я не знаю, как это сделать) Мне также интересно, есть ли решение этой проблемы в Azure FN v2?

...