Поймать исключение асинхронного метода в функции Azure - PullRequest
0 голосов
/ 08 января 2019

Я написал функцию 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 или что-то еще?

1 Ответ

0 голосов
/ 09 января 2019

вам нужно написать асинхронный совет, например:

public class LoggerAspectAttribute : Attribute, IMethodAsyncAdvice
{
    public async Task Advise(MethodAsyncAdviceContext context)
    {
        //Logger initilizer here
        Console.WriteLine($"{context.TargetType.Name} started...");
        try
        {
            await context.ProceedAsync(); // this calls the original method
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
        }
        finally
        {
            Console.WriteLine($"{context.TargetType.Name} completed...");
        }
    }
}

РЕДАКТИРОВАТЬ : и да, он работает с Mr Advice:)

...