Как обрабатывать AggregateException из лямбда-функции в Statemachine - PullRequest
0 голосов
/ 31 января 2019

У меня есть async лямбда-функция.Любое исключение, возникающее внутри лямбда-функции, переносится как AggregateException.Поэтому, если конечный автомат вызывает эту лямбду, он получает ее как AggregateException

[assembly: LambdaSerializer(typeof(Amazon.Lambda.Serialization.Json.JsonSerializer))]

namespace MyFunction
{
    public class MyHandler
    {
        public Payload DoWork(Payload payload, ILambdaContext context)
        {
           throw new MyCustomException("This is test");
        }
    }
}

ниже мой конечный автомат

{  
  "StartAt": "DoWork",
  "States": {        
     "DoWork":{      
      "Type":"Task",
      "Resource":"arn:aws:lambda:us-west-2:xxxxx:function:MyHandler:dev",
      "Next":"OK",
       "Catch": [
         {
            "ErrorEquals": [ "MyCustomException" ],
            "Next": "HandleMyCustomException"
          },
          {
            "ErrorEquals": [ "States.ALL" ],
            "Next": "HandleAllErrors"
          }
      ]
    },       
    "HandleAllErrors": {      
      "Type": "Fail",
      "Cause": "UnknownError",
      "Error": "Unable to perform work."      
    },
    "HandleMyCustomException":{      
      "Type":"Fail",
      "Cause":"MyCustomError",
      "Error":"An unknown error occurred while processing. Please check the logs."
    },
    "OK": {
      "Type": "Pass",
      "Result": "The request has succeeded.",
      "End": true
    }
  }
}

, так как конечный автомат получает AggregateException, а не MyCustomException, он никогда не выполняется HandleMyCustomException шаг

Как мы справимся с этим.Я использую .NET Core 2.0 для разработки лямбда-функции

Ответы [ 2 ]

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

найдено

https://github.com/aws/aws-lambda-dotnet/issues/211#issuecomment-459454290

Я обновил свой лямбда-проект до .NET Core 2.1, а затем добавил переменную среды UNWRAP_AGGREGATE_EXCEPTIONS со значением 1

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

Вы должны поймать правильное исключение - то, которое выдает ваш код.Вы пишете, что все исключения обернуты как AggregateException, так что просто поймайте это в конечном автомате.Заменить "ErrorEquals": [ "MyCustomException" ] на "ErrorEquals": [ "AggregateException" ].

...