【问题标题】:Global exception handler in AWS .net Core Lambda project?AWS .net Core Lambda 项目中的全局异常处理程序?
【发布时间】:2019-03-06 03:03:08
【问题描述】:

简化——我用 .net CORE 创建了一个空的 AWS Lambda 项目:

这是默认的空 lambda 函数项目:

我想全局捕获应用程序中的所有异常。

所以我创建了一个生成异常的方法,并添加了一个全局应用程序处理程序:

完整代码:

 public class Function
    {
        void CreateException()
        {
            var z = 0;
            var a = 2 / z;
            Console.Write(a);
        }

        public Function()
        {
            AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
        }

        public void FunctionHandler(object input, ILambdaContext context)
        {
            CreateException();
        }

        private void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
        {
            // � It never gets here
        }

    }

问题是引发了异常,但它从不触发CurrentDomain_UnhandledException

问题:

这是捕获全局异常的正确方法吗?为什么在出现未处理的异常时不调用CurrentDomain_UnhandledException

【问题讨论】:

标签: c# amazon-web-services exception .net-core aws-lambda


【解决方案1】:

虽然我无法回答为什么这不起作用,但我可以告诉你我已经做了一个解决方法。

我使用的解决方法是将我的 FunctionHandler 包装在 try/catch 中。由于这是 lambda 函数中的唯一入口点,因此在这里抛出的任何内容都将被捕获......对于我的目的而言,它实际上就像一个全局处理程序。

public void FunctionHandler(object input, ILambdaContext context)
{
    try
    {
        CreateException();
    }
    catch (Exception e)
    {
        // Handle your 'uncaught' exceptions here and/or rethrow if needed
        Console.WriteLine(e);
        throw;
     }
}

您可能希望重新抛出:

  1. AWS 将再次重试该函数,然后您可以在 X 次重试后发送 DeadLetterQueue
  2. 您的 CloudWatch Logs 中出现异常

【讨论】:

  • 如果一个函数失败了,它会再次重新运行它??那个设置在哪里?
  • 这取决于您的 Lambda 函数是如何被调用的。一定要读一读 - docs.aws.amazon.com/lambda/latest/dg/retries-on-errors.html 我发现你必须非常小心基于流的东西。像 Dynamo 这样的东西会不断重试,直到它不抛出异常或流过期。如果你没有为此做好准备,你肯定会增加一些成本......当我整个周末的流程都失败时,我发现了这一点。
  • 我刚刚尝试了这个并得出了相同的结论......但是我的项目中有几十个 Lambda 函数,所以这真的很痛苦。
  • 这不是一个全局异常处理程序,因为它不会捕获单个构造函数错误!
  • 这不提供所要求的解决方案 - 它不是全球性的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-14
  • 1970-01-01
  • 1970-01-01
  • 2015-05-03
  • 1970-01-01
  • 2014-04-17
相关资源
最近更新 更多