AWS .net Core Lambda项目中的全局异常处理程序?

Roy*_*mir 5 c# exception amazon-web-services .net-core aws-lambda

简化—我使用.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
        }

    }
Run Code Online (Sandbox Code Playgroud)

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

题:

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

Tri*_*ror 2

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

我使用的解决方法是将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;
     }
}
Run Code Online (Sandbox Code Playgroud)

您可能想要重新抛出,以便:

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