Мне интересно узнать о хорошей практике обработки исключений в функциях 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?