Я написал функцию Azure v1, используя C # (проект библиотеки) с Aspect (AOP) для ведения журнала. Я не получаю исключения в блоке catch.
Поймать исключение, выданное асинхронным методом
У меня есть та же проблема, о которой говорилось выше, однако метод запуска функции Azure - Async Task, и его обработка исключений аналогична async void. Не уверен, где проблема? при условии, что это проблема с функцией SDK.
Функция Azure
public static class PingFunction
{
[LoggerAspect]
[FunctionName("PingFunction")]
public static async Task<HttpResponseMessage> Run([HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)]HttpRequestMessage req, TraceWriter log)
{
string name = string.Empty;
log.Info("C# HTTP trigger function processed a request.");
SomeService someService = new SomeService();
await someService.DoSomething();
return req.CreateResponse(HttpStatusCode.OK, "Hello " + name);
}
}
public class SomeService
{
public async Task DoSomething()
{
await Task.Delay(1000);
throw new Exception("Exception from Service");
}
}
Аспект логгера (MrAdvise)
public class LoggerAspectAttribute : Attribute, IMethodAdvice
{
public void Advise(MethodAdviceContext context)
{
//Logger initilizer here
Console.WriteLine($"{context.TargetType.Name} started...");
try
{
context.Proceed(); // this calls the original method
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
finally
{
Console.WriteLine($"{context.TargetType.Name} completed...");
}
}
}
Обход
Когда я удалил Async-await из функции Azure и вызвал асинхронный метод с помощью « GetAwaiter (). GetResult () », тогда он заработал.
public static HttpResponseMessage Run([HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)]HttpRequestMessage req, TraceWriter log)
{
string name = string.Empty;
log.Info("C# HTTP trigger function processed a request.");
SomeService someService = new SomeService();
someService.DoSomething().GetAwaiter().GetResult();
return req.CreateResponse(HttpStatusCode.OK, "Hello " + name);
}
Task.GetAwaiter (). Методы GetResult () создают потенциальную возможность возникновения проблем взаимоблокировки, и их следует избегать в пользу async / await .
Моя функция обрабатывает миллионы событий в день. Это правильное решение, если это проблема FunctionSDK или что-то еще?