当前位置: 首页 > 知识库问答 >
问题:

在Azure函数中捕获异步方法异常

佟和安
2023-03-14

我已经使用C#(库项目)和Aspect(AOP)编写了Azure函数v1用于日志记录。我在catch块中没有得到异常。

捕获异步方法引发的异常

我有上面讨论的相同问题,但Azure函数运行方法是异步任务,其异常处理和异步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");
    }
}

记录器方面

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...");
        }
    }
}

解决方法:当我从Azure函数中删除异步等待并通过“getWaiter().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()方法可能导致死锁问题,应避免使用异步/等待。

我的函数每天处理数百万个事件。如果这是FunctionSDK问题或其他问题,这是正确的解决方案吗?

共有1个答案

秦学林
2023-03-14

您需要编写异步建议,例如:

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建议:)

 类似资料:
  • 我目前正在努力创建EventhubTrig在Java函数应用程序,它侦听IotHub的默认endpoint。目前按照教程,我没有看到任何用于Java函数应用程序的异步实现的示例代码,而建议对C#函数应用程序使用async/wait。 我是否应该考虑/是否可以在Java中为Function Apps添加异步实现?是否有任何示例代码可以参考?我是否应该考虑在函数应用中添加并行编程/多线程逻辑? htt

  • 我无法在Spring中捕获异步方法抛出的异常。我已经编写了一个未捕获的异常处理程序来捕获,但没有成功。该应用程序将启用启动任意数量的永远运行的异步作业。我认为我的异步方法需要返回Future,以便我可以将其存储在hashmap中并检查其状态或停止作业。我也可以通过存储它来获取所有正在运行的作业。我认为我不能使用get method of Future,因为如果输入正确,它会阻塞,我的作业将永远运行

  • 当捕获异常时,其余代码仍会执行。 我试图用这种方式来捕捉异常,而不是尝试捕捉 我的第一个问题是如何在错误被捕获后阻止代码到达其余代码。 第二个问题是,如果我将Promise reject替换为注释掉的抛出错误,抛出的异常错误将不会被捕获,这是为什么?

  • 我有以下代码。 然而,它没有捕捉到所有的错误,我仍然得到“throw er//未处理的“错误”事件。 这是为什么呢? 例如,直到我添加了一个特定的错误处理程序,它才捕获parse()函数中的错误。即使不添加,我的try/catch是否应该捕获此错误? 提前致谢!

  • 我在一个函数中有这样的代码块: 它获取一些数据,然后对数据运行验证()。 但是,我对数据的验证实际上也是异步的,因为它是根据一个json模式来验证数据的,而json模式位于一个独立的json文件中,所以它必须首先读取该文件。 我使用了一个承诺来读取文件内容,然后进行验证: 如何编辑此问题中的顶部代码块以解释if语句()中的异步函数?

  • 没有await并且在非异步方法中调用异步方法的行为是什么?我这样问是因为我看到Visual Studio在调用异步方法时没有显示任何警告,好像这是一件非常正常的事情。在这种情况下,异步方法的行为是否像是同步的?